变量函数会被实际函数覆盖吗?

时间:2009-08-18 22:27:54

标签: php oop

我知道您可以使用如下变量名来调用函数:

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

我想知道在课堂上,实际的功能是否会覆盖 如果我有这门课:

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

这两种方法都能正常工作吗?

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

编辑:最初的想法是myOtherClass持有一个类,其中包含一个始终被访问的主函数,以及一些其他访问较少的函数。我可以使用test()将主函数链接到类,这样可以减少输入。但鉴于第一个答案,我可能会远离那个。

3 个答案:

答案 0 :(得分:4)

我不太清楚PHP能够回答你的问题,但我花了几年时间来维护产品,并且想指出一个严重的可维护性问题。考虑一下你是否能正常工作的问题。现在考虑维护代码的人将(a)与你有相同的问题,并且(b)可能不会阅读整个班级(除非它是非常小班级)。如果你从课外改变$ test,那将更难理解。

虽然这是一个有趣的问题,特别是从学术角度来看,从维护的角度来看,这是一种可怕的做法。 请为不同目的使用不同的变量名称;例如,使用$ otherClass作为指向另一个类的指针,使用test()作为测试函数,你的维护者(包括你自己,如果你维护自己的代码)会诅咒你少:)

答案 1 :(得分:2)

PHP允许使用相同名称的不同符号。与JavaScript和其他一些语言不同,PHP中的对象属性和方法完全不同:

// all of them work OK

define('SomeClass', 'SomeClass');

function SomeClass () {}

class SomeClass {}

这会导致PHP 5.3中的丑陋问题:

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

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

答案 2 :(得分:1)

您写道:

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

是的,这就是它的工作原理。你没有在那里使用任何变量。

$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. ;)