Ben bir şey dönmek için soyut bir sınıf yöntemi zorlayabilirsiniz?

3 Cevap

Ben soyut bir sınıf ve bir şablon dosyasının adını döndürmek gerekiyordu bir yöntem belirledik. Kullanıcı, bu soyut sınıf alt sınıf ve yöntem şablon dosya adını döndürmek için bu uygular. Ama sorun kullanıcı sadece bir şey dönmezse, hiçbir uyarı ya da ne olursa olsun orada olur olmasıdır.

Bunu nasıl emin olabilir? Bu yöntemi çağıran kodu çerçeveye ait, böylece yardımcı olur, ben, settype($returnVal, 'string') belki bazı fantezi şeyler yapabilirdi? Daha iyi çözümler var mı?

3 Cevap

PHP, bir şey dönmek için bir yöntem "zorla" değil - ve hatta soyut sınıflar / yöntemleri, ne de arayüzleri ile, mümkün değil.

Yapabileceğiniz en iyi olduğu uygulama bir yorum kullanarak, bir şey dönmek gerektiğini belirtmek - ama bunu insanları zorlayamaz:

/**
 * @param string $a blah blah
 * @return int The return value blah blah
 */
public function my_method($a);

Tabii ki, sizin çerçevesinde bu yöntemi (the implementation) çağırıyor iseniz, iade edilmiştir ne kontrol edebilir, ve beklediğiniz karşılık değilse bir istisna ...


And here is a quick example of how this could be implemented :

class ClassA {
    /**
     * @param string $a blah blah
     * @return ClassB The return value blah blah
     */
    public function my_method($a) {
        echo 'blah';
    }
}

class ClassB {
    // ...
}


$a = new ClassA();
$returned = $a->my_method(10);
if (!$returned instanceof ClassB) {
    throw new Exception("Should have returned an instance of ClassB !");
}

Yöntemi ClassB bir örneğini dönmez gibi burada, istisna atılır.

Bunu yapmak için aklınıza tek yolu arama kodu kullanacak üst sınıf bir public final yöntemini, ve {[tarafından çağrılacak bir protected yöntem oluşturmak olduğunu ( 0)}] yöntemi. protected yöntemi işlevselliğini içerir ve public final yöntemi protected yöntemin dönüş değeri doğrular.

class A {

    public final call_this($param) {

    	$return_value = $this->extend_this($param);

    	// validate $return_value
    	if( $return_value == '' )
    		throw new Exception("uh-oh! Don't return an empty string!");

    	return $return_value;

    }

    protected extend_this($param) {

    	// default behavior

    	return $whatever;

    }

}

class B extends A {

    protected extend_this($param) {

    	// new behavior

    	return ''; //whoops!

    }

}

$b = new B;
$b->call_this("testing testing 123");
//exception!

Eğer iyi belgelenmiştir emin olun, böyle bir şey denerseniz bu olsa sınıfını genişleterek kişi için biraz kafa karıştırıcı olabilir.

public final bilmiyordum durumda, geçersiz edilemez bir kamu yöntemdir. Ayrıca bu sadece PHP 5.0.0 ya da daha iyi çalışacak unutmayın.

Bildiğim kadarıyla, PHP dönüş değerleri için Tür Dayatma ulaşmak için hiçbir yolu yoktur. PHP 5, function parameters sınırlı ima yoktur.

Ama orada bile, ne yapmaya çalışıyorsun tip ipuçlarının bir iş değil. Ben dönmek dize boşsa ne olur? Sen yöntemi çağrılır yerde dönüş değeri için kontrol etmeniz gerekir, ve uygun bir tepki olacaktır.