Php 变量函数是否被实际函数覆盖?

Php 变量函数是否被实际函数覆盖?,php,oop,Php,Oop,我知道可以使用如下变量名调用函数: $foo = "bar"; function bar() { echo "test"; } $foo(); // echos test 我想知道在一个类中,是否有一个实际的函数覆盖了它。 如果我上过这门课: class myClass{ public $test; public function __construct() { $this->test = new myOtherClass; }

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

$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

Edit:最初的想法是
myOtherClass
拥有一个类,其中一个主要功能一直可以访问,另外一些功能访问较少。我可以使用
test()
将主函数链接到类,从而减少键入。但是给出了第一个答案,我可能会远离这个问题。

我对PHP的了解还不足以回答您的问题,但我花了几年时间维护产品,并想指出在维护方面存在的严重困难。考虑一下你是否有这个问题。现在认为,维护你的代码的人将(a)有与你相同的问题,并且(b)可能不阅读整个班级(除非它是一个非常小的班级)。如果你在课外更改$test,那就更难理解了


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

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


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

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 :(

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 :(
你写道:

$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. ;)
你写道:

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


@Chacha102-你居然还没试过,真让我吃惊!这就是当您无法安装时所发生的情况anything@Chacha102-你是说你不能安装PHP?是的。或FTP客户端。我得等一会儿才能来。还有一些意见。@Chacha102-听到这个消息我很难过,祝你好运@Chacha102-你居然还没试过,真让我吃惊!这就是当您无法安装时所发生的情况anything@Chacha102-你是说你不能安装PHP?是的。或FTP客户端。我得等一会儿才能来。还有一些意见。@Chacha102-听到这个消息我很难过,祝你好运!确切地说,这是一种真正不应该存在的语言特征。基于反射的系统很难遵循,而且它们至少有非常明确的规则必须遵循。@atk-+1同意,仅仅看第一段代码就让我头疼。这背后的想法是如果$test持有一个类,该类大多数时间都访问一个函数,我可以创建一个助手函数,使其更容易键入。但我明白你的意思。第一段代码让你头疼?函数指针让你头疼?当然,这可能不是实现它的最佳方式,但这正是它的本来面目。@LorenVS-每种语言都有自己的机会来编写不清楚的代码,而清楚的代码可以用每种语言编写(甚至Perl:)。函数指针的特性非常有用,可以使一些源代码非常优雅和干净,所以我认为不应该完全删除它。它只是需要小心使用。确切地说,这是一种真正不应该存在的语言特性。基于反射的系统很难遵循,而且它们至少有非常明确的规则必须遵循。@atk-+1同意,仅仅看第一段代码就让我头疼。这背后的想法是如果$test持有一个类,该类大多数时间都访问一个函数,我可以创建一个助手函数,使其更容易键入。但我明白你的意思。第一段代码让你头疼?函数指针让你头疼?当然,这可能不是实现它的最佳方式,但这正是它的本来面目。@LorenVS-每种语言都有自己的机会来编写不清楚的代码,而清楚的代码可以用每种语言编写(甚至Perl:)。函数指针的特性非常有用,可以使一些源代码非常优雅和干净,所以我认为不应该完全删除它。只是需要小心使用。