我在PHP中遇到了一些面向对象编程的麻烦。
我基本上在一个类中有一个函数,它显示一些文本:
public function text() {
echo 'text';
}
现在我想将函数名存储在arra中,所以我稍后可以引用它:
$functions = array('text_func' => 'text');
在另一个函数中,我想用Array引用调用上面的函数,所以我做了以下内容:
public function display() {
$this->functions['text_func']();
}
结果基本上是:
text();
我的问题是,如何才能运行此功能? (它应该是正确的方式:$this->text()
)。但是我不能做这样的事情,因为它给了我一个错误:
$this->$this->functions['text_func']();
我的问题的任何想法或解决方案?
答案 0 :(得分:1)
您小心忽略的错误消息可能会警告您$this
无法转换为字符串。这为你提供了很好的线索。
(很长的答案是方法名称是字符串。由于PHP是松散类型的,当它需要一个字符串时,它会尝试将你提供的任何内容转换为字符串。你的类缺少__toString()
方法,因此错误。)
你可能想要这个:
$this->{$this->functions['text_func']}();
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
答案 1 :(得分:0)
以下是来自PHP.net的示例应该有所帮助:
<?php
class Foo
{
function Variable()
{
$name = 'Bar';
$this->$name(); // This calls the Bar() method
}
function Bar()
{
echo "This is Bar";
}
}
$foo = new Foo();
$funcname = "Variable";
$foo->$funcname(); // This calls $foo->Variable()
?>
来源:http://www.php.net/manual/en/functions.variable-functions.php
答案 2 :(得分:0)
你很困惑很多事情。首先,您可以使用magic constants __METHOD__
和__CLASS__
来确定您当前正在执行代码的类类型和方法。
其次,PHP is defined as中的callable
是带有对象实例的array
或索引为0的静态类引用,以及索引为1的方法名称,或者自PHP 5.2以来完全限定的字符串,例如MyClass::myFunction
。您只能动态调用存储为这些类型之一的函数。在函数之间传递时,可以使用类型提示callable
。
答案 3 :(得分:0)
$这不包含自身的引用,所以你应该尝试
$this->display();
而不是
$this->$this->functions['text_func'](); // WRONG