我可以在一个对象中声明一个方法作为一个静态和非静态的方法,并使用相同的名称调用静态方法吗?
我想创建一个类,它有一个静态方法“send”和一个调用静态函数的非静态方法。例如:
class test {
private $text;
public static function instance() {
return new test();
}
public function setText($text) {
$this->text = $text;
return $this;
}
public function send() {
self::send($this->text);
}
public static function send($text) {
// send something
}
}
我希望能够调用这两个函数
test::send("Hello World!");
和
test::instance()->setText("Hello World")->send();
可能吗?
7条答案
按热度按时间oymdgrw71#
你可以做到这一点,但这有点棘手。你必须用重载来做:
__call
和__callStatic
魔术方法。这不是一个理想的解决方案,因为它使您的代码更难理解,但它会工作,只要您有PHP >= 5.3。
5m1hhzi42#
我将创建一个隐藏类作为构造函数,并返回父类中的隐藏类,该父类具有与隐藏类方法相等的静态方法:
静态调用它:
动态调用它:
gblwokeq3#
不能有两个同名的方法。你可以通过重命名其中一个方法来做基本相同的事情。将
test::send("Hello World!");
重命名为test::sendMessage("Hello World!");
即可。我只需要创建一个single send方法,并使用一个可选的text参数来改变方法的功能。我想知道为什么你需要静态功能。
yfjy0ee74#
我同意应该不惜一切代价避免这种情况,但在某些情况下,这可能是有用的。
在大多数情况下,它只会使您的代码不可读和不可管理。
相信我,我也经历过。
下面是一个用例场景的例子,在这个场景中它可能仍然是实用的。
我正在扩展CakePHP 3.0的File类作为我的默认文件处理类。
我想把一个静态哑剧类型的猜测。
在某些情况下,我有一个文件名,而不是一个实际的文件和一些假设需要在这种情况下作出。(如果文件存在,请尝试从中获取MIME,否则请使用提供的文件名扩展名)
其他时候,如果我实际上示例化了一个对象,默认的mime()方法应该可以工作,但是如果它失败了,则需要从对象中提取文件名,并且应该调用静态方法。
为了避免混淆,我的目标是通过调用相同的方法来获取mime类型:
静态:
作为对象
以下是我的扩展类示例:
8oomwypt5#
在php中,你可以设置/分配一个类方法,方法可见性(Public,Private,Protected),也可以声明类方法或类属性的限制分布,比如那些可以在类外部访问的。
为了呼叫的目的,我们有两种方法,
1.非静态($this->)
让我们拿一个类Foo有一些方法和属性..具有可见性和呼叫方法
现在测试这个类
请参见In Action here。
0s0u357o6#
删除E_STRICT错误日志的另一个选项如下所示:
?>
3zwtqj6y7#
对不起,我撞到了一个老主题,但我想扩展一下@lonesomeday的答案。(感谢@lonesomeday提供的初始代码示例。
我也在尝试这个,但不想像他在原始帖子中那样调用这些方法。我有下面的代码,* 似乎 * 工作: