PHP dinamik statik yöntem çağrısı?

7 Cevap php

Birisi şu PHP yardımıyla dışarı deneyimli olabilir lütfen. Somewhere benim kod, ben olmayan bir örneklenmiş sınıf içinde ortak bir statik yöntemine yapılan bir çağrı var:

$result = myClassName::myFunctionName();

Ancak, birçok tür sınıflar var ve kullanıcının diline göre anında doğru sınıf adını belirlemek istiyoruz. Diğer bir deyişle, I vardır:

$language = 'EN';

... Ve ben böyle bir şey yapmak gerekiyor:

$result = myClassName_EN::myFunctionName();

Ben bir işleve parametre olarak dili geçmek ve sadece tek bir ortak sınıf içinde onunla başa ancak çeşitli nedenlerle, farklı bir çözümü tercih ederim olabileceğini biliyorum.

Bu herhangi bir anlamda, herkes yapar mı? Teşekkürler.

7 Cevap

: call_user_func işlevini kullanın

http://php.net/manual/en/function.call-user-func.php

Örnek:

call_user_func('myClassName_' . $language . '::myFunctionName');

Ben bir fabrikada ihtiyacınız sınıfının oluşturulmasını saklanması olacaktır.

Eğer doğru sınıfa dili haritalama için temel adı veya kuralları değiştirmek gerektiğinde bu şekilde tek bir giriş noktası olacaktır.

    class YourClassFactory {

        private $_language;
        private $_basename = 'yourclass';

        public YourClassFactory($language) {
            $this->_language = $language;
        }

        public function getYourClass() {
            return $this->_basename . '_' . $this->_language;
        }    
    } 

ve sonra, bunu kullanmak zorunda:

$yourClass = $yourClassFactoryInstance->getYourClass();
$yourClass::myFunctionName();

Temuri dediği gibi '$ SınıfAdı :: functionName' çalışırken, ayrıştırma hatası, üretilir:

Sözdizimi hatası, beklenmedik T_PAAMAYIM_NEKUDOTAYIM ...: hatası Ayrıştırma

Benim durumumda (2 argümanlarla statik yöntem), en iyi çözümleri (nikc.org tarafından önerilen) call_user_func_array 2 diziler ile kullanmaktır:

$result = call_user_func_array(array($className, $methodName), array($ard1, $arg2));

BR

I think bunu yapabilirsiniz:

$classname = 'myClassName_' . $language;
$result = $classname::myFunctionName();

Bu {[(0)] olarak adlandırılır}

i anlaşma yolu çok kötü bir fikir olduğunu düşünüyorum, ancak, ben bir çözüm olabilir düşünüyorum

$className = 'myClassName_'.$language;
$result = $className::myFunctionName();

ben bu ne istediğiniz olduğunu düşünüyorum

Bildiğim kadarıyla ben sizin sorunuzu anlayabilirdim gibi, sen get_class fonksiyonu kullanılarak yapılabilir sınıf adını almak gerekiyor. Öte yandan, Reflection class bu OOP şekilde vb yöntemler, argümanlar, gelince büyük olan burada size yardımcı olabilir.

Çözümler gibi:

$yourClass::myFunctionName();

çalışmaz. PHP ayrıştırma hatası üretecektir.

Ne yazık ki, tek yolu kullanmaktır very slow call_user_func().