Değişkenli fonksiyonlar gerçek işlevlerine tarafından üzerine olsun musunuz?

3 Cevap php

Ben böyle değişken adlarını kullanarak işlevleri çağırabilirsiniz biliyorum:

$foo = "bar";
function bar()
{
    echo "test";
}
$foo(); // echos test

I am wondering if in a class, an actual function overrides that.
If I had this class:

class myClass{
    public $test;
    public function __construct()
    {
         $this->test = new myOtherClass;
    }
    public function test()
    {
         echo "foo";
    }
}

Bunların her ikisi de doğru çalışmak istiyorsunuz?

$obj->test(); // echo foo
$obj->test->method(); // access a method of myOtherClass

Edit: Bunun için orijinal fikir myOtherClass her zaman erişilen bir ana fonksiyonu olan bir sınıf düzenledi, ve birkaç diğer daha az erişilebilir olanlar oldu. Ben daha az yazım var yani test() sınıfına ana işlevi bağlamak için kullanabilirsiniz. Ama ilk cevap verilmiş Herhalde Bundan uzak çakacağım.

3 Cevap

Ben sizin sorunuzu yanıtlamak için yeterince iyi PHP bilmiyorum, ama ben ürünlerini korumak birkaç yıl geçirdi ve bu ile sürdürülebilirlik ile ciddi bir zorluk işaret etmek isterim. Bu bile düzgün çalışacak olmadığı konusunda soru var düşünün. Şimdi kodu muhafaza kişi (a) aynı soru var olacağını düşünün olarak ve (bir very küçük sınıf sürece), (b) muhtemelen bütün sınıfı okumak değil. Eğer sınıfın dışından $ testini değiştirme eğer Ve, daha da zor anlamak olacaktır.

Bu özellikle bakış bir akademik açıdan ilginç bir soru, iken, bu bakış bir bakım açısından korkunç bir uygulamadır. Please use different variable names for different purposes; for example, use $otherClass for the pointer to the other class and test() for the test function ve (kendi kodunu korumak varsa, kendiniz dahil) bakıcılarına daha az küfür edecek :)

PHP aynı isimde farklı semboller sağlar. Nesne özellikleri ve yöntemleri JavaScript ve diğer bazı dillerde aksine, PHP tamamen farklı şeylerdir:

// all of them work OK

define('SomeClass', 'SomeClass');

function SomeClass () {}

class SomeClass {}

Bu PHP 5.3 çirkin sorunlara neden olur:

$foo = new StdClass;
$foo->bar = function () {
    return "bar";
};

$foo->bar(); // does not work, unfortunately :(

You yazdı:

$obj->test(); // echo foo
$obj->test->method(); // access a method of myOtherClass

Pekala, işte bu nasıl işliyor. Orada değişken bir şey kullanarak değiliz.

$obj->test;    // member variable $test of $obj
$obj->test();  // method test() of $obj
$obj->$test(); // variable function, result depends on content of $test

$obj->test()->otherTest();    // invokes otherTest() on an object
                              // returned by $obj->test()

$foo = 'test';
$bar = 'otherTest';
$obj->$foo()->$bar();         // same as above, but please, for the love of God,
                              // don't ever use this. ;)