2015-05-04 23 views
14

Uzun bir metin yazmak istemiyorum, çünkü kısa bir soru. PHPUnit testleri, statik olan çeşitli yöntemler içerir. Örneğin, tüm bu \PHPUnit\Framework\Assert::assert*() methods ve ayrıca identicalTo, equalTo.

IDE (IntelliSense/otomatik tamamlamayla), $this numaralı aramaları kabul etmiyor, ancak kendi kendine. Statik fonksiyonların, bir nesne değil, sınıf yoluyla çağrılması gerektiğini öğrendim, yani self.

Daha doğru olan nedir?

$this->assertTrue('test'); 

veya

self::assertTrue('test'); 

?

(Ve biz "kendini" kullanmamalısınız neden belki işaret edebilir, daha doğrudur "$ this" olur?)

+0

Bu iyi bir soru. Ayrıca, yöntemlerin neden statik olduğunu tam olarak anlamıyorum, ancak gördüğüm tüm kodlar, bunu kendinin yerine $ kullanın. –

cevap

3

Genellikle self sadece (karışıklığa sen self ile statik olmayan yöntemlere başvurmak ve $this ile statik yöntemlere olsa statik yöntemleri ve özellikleri belirtmek için kullanılır, başvuru değil self ile adlandırılan yöntemler sağladı $this.)

<?php 
class Test { 
    public static function staticFunc() {echo "static ";} 
    public function nonStaticFunc() {echo "non-static\n";} 
    public function selfCaller() {self::staticFunc(); self::nonStaticFunc();} 
    public function thisCaller() {$this->staticFunc(); $this->nonStaticFunc();} 
} 
$t = new Test; 
$t->selfCaller(); // returns "static non-static" 
$t->thisCaller(); // also returns "static non-static" 

Kalıtım $this veya self ile uğraşırken hatırlamak önemlidir. $this her zaman geçerli nesneyi gösterir, self ise self'un kullanıldığı sınıfı belirtir. Modern PHP aynı zamanda late static bindingstatic anahtar sözcüğü ile çalışır, bu da statik işlevler için $this ile aynı şekilde çalışır (ve tercih edilmelidir).

<?php 
class Person { 
    public static function whatAmI() {return "Human";}  
    public function saySelf() {printf("I am %s\n", self::whatAmI());} 
    public function sayThis() {printf("I am %s\n", $this->whatAmI());} 
    public function sayStatic() {printf("I am %s\n", static::whatAmI());} 
} 

class Male extends Person { 
    public static function whatAmI() {return "Male";} 
} 

$p = new Male; 
$p->saySelf(); // returns "I am Human" 
$p->sayThis(); // returns "I am Male" 
$p->sayStatic(); // returns "I am Male" 

olarak özellikle PHPUnit bakımından, the way they've always done them basitçe şeyler görünür! Belgelerine göre, statik yöntemler kullanarak your code should work fine.

+0

Bu gerçekten iyi bir cevap. Üzgünüm geç saatlerde bunu gördüm. Şimdi, bu tanımlayıcıların nasıl çalıştığını daha çok anlıyorum. Ama yine de, konsept benim için kafa karıştırıcı. Neden PHP'de statik işlevlerin üzerine yazabilirsiniz, böylece geri dönüş değeri aslında çocuklarda değişir? Ve bunun neden olabileceğinin yanı sıra, neden PHPUnit, $ this-> 'yi kullanıyor ve doğru 'static ::' erişimini kullanmıyor? Eski kod? – Wolfsblvt

+0

"Statik", normal İngilizce kullanımında olduğu gibi değişmeyen anlamına gelmez. Basitçe [nasıl adlandırılır] (https://en.wikipedia.org/wiki/Method_ (computer_programming) #Static_methods) (yani, bir nesnenin örneğine gerek kalmadan) bunları çocuk sınıflarında yeniden tanımlamakta hiçbir sorun yoktur.Ben PHPUnit ile aşina değilim, ama sadece [şeyler yapmanın yolu] gibi görünüyor (https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.static-vs- statik olmayan kullanımın olmadığı-of-the iddiası-yöntemlerle). – miken32

+0

Hala kafamı ne kadar kirli ve kafa karıştırıcı çevrelemiyorum, ama sanırım PHP bu kadar basit. Hızlı cevabınız için teşekkürler, cevabınız, burada verdiğiniz bağlantı ile birleştirildiğinde gelecekteki okuyucular için yeterli bilgi olmalıdır. Bunu çözüldü olarak işaretleyeceğim. – Wolfsblvt

2

PHPUnit 4.8.9: vendor/phpunit/phpunit/src/Framework/Assert.php:

/** 
* Asserts that a condition is true. 
* 
* @param bool $condition 
* @param string $message 
* 
* @throws PHPUnit_Framework_AssertionFailedError 
*/ 
public static function assertTrue($condition, $message = '') 
{ 
    self::assertThat($condition, self::isTrue(), $message); 
} 

Teknik static::assertTrue() doğru ama assert yöntemlerinin ortak kullanımı $this->assertTrue()'dur.

+2

Ancak, "self :: assertTrue()", daha doğru bir yol olacaksa, neden bu $> assertTrue() 'yi kullanmalısınız? Bu konudaki noktayı anlamıyorum. Benim sorumun sebebi buydu. – Wolfsblvt

+6

https://github.com/sebastianbergmann/phpunit/issues/1914 – user1983686

İlgili konular