PHP Soyut Yöntem Çözünürlük

3 Cevap

Ben aşağıdaki gibi tanımlanan soyut bir sınıf vardır:

abstract class Abstract Parent extends Zend_Db_Table_Abstract { 
    abstract function funcA($post);
    abstract function funcB();

    public function newEntry($post)	{  
    	$t1 = $this->funcA($post);
    	$t2 = $this->funcB();
    }
}

Aşağıdaki gibi sınıf çocuk, iki soyut yöntemlerini tanımlar:

require_once 'atablemodel.php';

class Child extends AbstractParent {    
    public function funcB() 
    {
    	return 'Some Value';
    }

    public function funcA($post) 
    {
    	$data = array(
    	    'v1'	=> htmlentities($post['v1'])
    	);
    	return $data;
    }
}

Ben bu deneyin Ancak, ben bir hata alıyorum:

Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /var/www/.../abstractparent.php on line 27

hangi soyut ana soyut yöntemlerden birini çağırıyor hattıdır. Ne olmasını istiyorum bu hat tanımlanan çocuk yöntemini çağırın gerektiğidir.

Şimdi, bunu yapmak için bir yol olduğunu varsayalım, ve PHP için bir acemi olduğum için, ben temelde yanlış bir şey yapıyorum. Ben ne yapabileceği gibi herhangi bir öneri bu sorunu çözmek için? Ben uygulamaları olan, ve sonra (hepsi de soyut sınıflar ile anlaşma değil) tüm çocukların bu yöntemleri geçersiz kılma gibi iki soyut yöntemlerini tanımlamak için olsaydı, nasıl bu yöntemlerden birini çağırarak ana uygun çağırır olacağını sağlayacak yürütme zamanda çocuk yöntemi?

EDIT

Statik ve soyut birleştirerek konuda çeşitli yorumlar ışığında, ben de yukarıda gösterildiği, yeni bir hata ile yukarıdaki gibi sınıfları yeniden.

3 Cevap

Statik yöntem, statik işlev sınıfı başlatmasını olmadan kullanılabilir gibi, $this kendisini başvuru için kullanamazsınız, ve bu nedenle $this mevcut garanti edilemez.

self anahtar kelime sınıf ağacında yöntemleri başvurmak için kullanılır. Bunu böyle uygulamak isterdim:

public static function newEntry($post)      {  
    $t1 = self::funcA($post);
    $t2 = self::funcB();
}

Ancak, Late Static Binding class yapıları çevreleyen sorunlar olduğunu unutmayın. PHP 5.3 farklı kapsam çözünürlük için bu tür önceki sürümlere göre çalışır, bu yüzden üzerinde okumak için emin olabilirsiniz. Üst / alt yapısı sizin için düzgün çalışmıyorsa, her zaman, yani hem tam classname tarafından statik bir yöntem başvuruda bulunabilir. Child::funcA.

Geçerli nesnenin bir yöntemini çözmek için, ihtiyacınız $this:

    $t1 = $this->funcA($post);
    $t2 = $this->funcB();

çağrı funcA() yalnız bir global tanımlı bir işlev değil, bir yöntem arar.

Eğer nesne dışından yöntemini çağırmak istiyorsanız, kullanmak

$objectname->methodname()

Statik olarak işlevlerini ilan, böylece bu $ ile kullanamazsınız. Statik yöntemler öz :: veya classname yoluyla ile başvurulabilir ::

Sen statik olmayan yöntemleri sınıfının bir örneği üzerinde $ kullanabilirsiniz.