代码之家  ›  专栏  ›  技术社区  ›  rg88

访问由单独类中的方法实例化的类

  •  1
  • rg88  · 技术社区  · 15 年前

    简而言之:如何访问由不同类的方法实例化的类的方法?

    我现在看到的一些代码可以做以下工作(改变代码不是一种选择,顺便说一句,它不是我的…我只是破译它):

    类具有实例化其他类的方法。看起来像这样:

    // this file is named fooClassHere.php
    
    class Foo{
        public $meh;
    
        function bar(){
            $something = new Baz;
            $this->meh = $something->getStuff();
        }
    }
    

    我想知道的是如何访问这个实例化类baz的方法。另一页包含如下内容:

    include 'bazClassHere.php';
    include 'fooClassHere.php';
    
    $a = new Foo;
    $a->bar();
    

    那么,难道所有BAZ现在都不应该以某种方式可用吗(而不仅仅是getstufacture(),我分配给$this->meh)?其中包括foo和baz类,代码实例化foo,然后调用foo的方法bar(),后者反过来实例化baz类。显然,下面将显示baz的getstuff()方法返回的数据:

    var_dump($a->meh);
    

    但我想进入 全部的 在BAZ的可用方法中,不需要像在FOO的BAR方法中那样通过手动分配的中间步骤:

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

    可能有点像(但这当然行不通):

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

    我希望这是有道理的,我没有把这个问题和我的笔记混淆。阿克!& lt;

    2 回复  |  直到 15 年前
        1
  •  3
  •   Paolo Bergantino    15 年前

    如果改变代码不是一个选择,你就走运了。为了达到你想要的目标,你必须做到:

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

    然后你可以做:

    $foo = new Foo;
    $foo->something->myBazMethod();
    
        2
  •  1
  •   Mario    15 年前

    您可以在foo类上使用\调用,在php.net上查找

    基本上,当您试图调用类没有的函数时,会调用\调用。在这里,您可以将请求传递给您的内部对象。

    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!');