Ayrı bir sınıf içinde bir yöntemle örneği olan bir sınıfı erişme

2 Cevap php

Özetle: nasıl bir sınıfın farklı bir yöntemle örneği bir sınıfın yöntemlerini erişebilirim?

Ben şimdi bakıyorum kod bit olduğunu yapar (kodunu değiştirmeyi btw Benim değil ... Ben sadece bunu deşifre ediyorum, bir seçenek değildir.) Aşağıdaki gibidir:

A sınıfı farklı bir sınıfını başlatır bir yöntemi vardır. Bunun gibi bir şey görünüyor:

// this file is named fooClassHere.php

class Foo{
    public $meh;

    function bar(){
        $something = new Baz;
        $this->meh = $something->getStuff();
    }
}

Ne ben anlamaya çalışıyorum bu örneklenmiş sınıf Baz yöntemlerini erişmek için nasıl. Başka bir sayfa aşağıdaki gibi bir şey içerir:

include 'bazClassHere.php';
include 'fooClassHere.php';

$a = new Foo;
$a->bar();

Yani tüm Baz bazı şekilde artık mevcut (ve ben $ atanan sadece getStuff () bu-> meh) gerekir? Foo ve Baz sınıfları kod Foo başlatır ve daha sonra sırayla Baz sınıfını başlatır Foo yöntemi bar () çağırır, dahildir. Açıkçası şu BAZ en getStuff () yöntemi tarafından döndürülen verileri görüntüler:

var_dump($a->meh);

Ama ben Foo bar yönteminin içine yaptığı gibi bunları el atama ara adım geçmeden all Baz en geçerli yöntemlerden erişmek istiyorum:

$this->meh = $something->getStuff()

Maybe something like (but of course this doesn't work):

$a = new Foo;
$a->bar(); //instantiates Baz as $something $a->something->fromBaz(); //$something is an instance of Baz, yes? No?

Bu mantıklı umut ve benim notları ile konuyu karıştırmayın vermedi. Uçaksavar! > _ <

2 Cevap

Kodunu değiştirerek bir seçenek değilse, şans bitti. Bunu yapmak istediğinizi elde etmek için:

class Foo {
    public $meh;
    public $something;

    function bar(){
        $this->something = new Baz;
        $this->meh = $this->something->getStuff();
    }
}

Ve daha sonra da yapabilirsiniz:

$foo = new Foo;
$foo->something->myBazMethod();

Sen Foo sınıfının üzerinde __ aramayı kullanabilirsiniz, php.net üzerinde arayın

Eğer sınıf olmayan bir işlevi çağırmak çalıştığınızda Temelde, __ çağrı çağrılır. Orada, bunun yerine iç nesne isteği geçebileceği.

class a
{
    protected $b;

    public function __construct()
    {
        $this->b = new b();
    }

    public function meh()
    {
        return 'meh';
    }

    public function __call($func, $param)
    {
        return call_user_func_array(array($this->b, $func), $param);
    }
}

class b
{
    public function yo($something)
    {
        return $something;
    }
}

$a = new a();
echo $a->meh();
echo $a->yo('dude!');