PHP - 如何从上游对象调用函数

时间:2015-03-02 17:49:58

标签: php

我有一个需要身份验证的数据库接口对象DBI。我有一个对象foo,它不会扩展任何东西。我还有一个扩展DBobject的类栏如果我有一个foo实例,那么它是bar的成员:

$b->$f=new foo;

如何从foo类中的函数调用$ b中的somefunction()?我已尝试将somefunction()设为静态,但我不希望在我的代码中散布身份验证信息。如果我尝试让foo扩展DBI或bar类,我最终会遇到一个问题,包括文件和我的foo __construct函数失败,因为找不到bar类。是否有另一个类似于extends / parent ::的构造,我可以使用只是彼此实例的对象?

2 个答案:

答案 0 :(得分:1)

我过去做过这种方式的方法是在__construct()中的Bar对象中创建Foo对象。然后使用__call魔术方法拦截方法并查看它的位置。所以代码看起来像这样:

public function __call($sMethod, $aArgs) {

    if(method_exists($this, $sMethod){
        return call_user_func_array(array($this, $sMethod), $aArgs);
    }

    } elseif(method_exists($this->foo, $sMethod)) {
        return call_user_func_array(array($this->foo, $sMethod), $aArgs);
    }

}

public function __construct() {

    $this->foo = new foo();

}

然后你可以从foo或bar调用这些函数,即使它们没有被扩展。但是,也许有一种更简单的方法可以做到这一点。

**编辑** 这样做的好处是你不需要指定你是从foo还是从bar调用方法,它们只是“工作”。

**编辑**

根据评论,您想要这样做,对吗?因为根据下面的代码,如果你运行它,它可以正常工作。

class foobar {

    public function test() {
         echo 'This is a test';
    }

}

class foo extends foobar {

}

class bar {

}

$bar = new bar();
$bar->foo = new foo();

$bar->foo->test();

或替代方案:

class foobar {

    public function test() {
        echo 'This is a test';
    }

}

class foo extends foobar {

}

class bar {

public function testFooBar() {

        $this->foo->test();

    }

}

$bar = new bar();
$bar->foo = new foo();

$bar->testFooBar();

只要您知道要为对象设置的属性名称,两者都可以正常工作。

答案 1 :(得分:1)

除了call_user_funccall_user_func_array之外,如果要访问容器对象(而不是父类)的方法和属性,则需要对它进行引用。 Here是一个类似的帖子。