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:)。函数指针的特性非常有用,可以使一些源代码非常优雅和干净,所以我认为不应该完全删除它。只是需要小心使用。