gpt4 book ai didi

php - 为什么 PHP 在对象上下文中使用静态方法?

转载 作者:IT王子 更新时间:2023-10-29 00:01:23 24 4
gpt4 key购买 nike

我有以下代码(实际上,这是我的真实代码):

<?php
class Foobar
{
public static function foo()
{
exit('foo');
}
}

当我运行 $foobar = new FooBar; $foobar->foo() 它显示 foo

为什么 PHP 会尝试在对象上下文中使用静态方法?有没有办法避免这种情况?


好的,你们没听懂我的问题:我知道静态和非静态方法之间的区别以及如何调用它们。这就是我的全部观点,如果我调用 $foobar->foo(),为什么 PHP 会尝试运行静态方法?


注意:我运行 PHP 5.4.4,向 E_ALL 报告错误。

最佳答案

要调用静态方法,您不要使用:

$foobar = new FooBar;
$foobar->foo()

你打电话

FooBar::foo();

PHP 手册说...

Declaring class properties or methods as static makes them accessible without needing an instantiation of the class. A property declared as static can not be accessed with an instantiated class object (though a static method can).

这就是为什么您能够在实例上调用该方法,即使那不是您打算做的。

无论您是静态调用还是在实例上调用静态方法,都不能在静态方法中访问$this

http://php.net/manual/en/language.oop5.static.php

您可以检查您是否处于静态上下文中,尽管我会质疑这是否有点矫枉过正...

class Foobar
{
public static function foo()
{
$backtrace = debug_backtrace();
if ($backtrace[1]['type'] == '::') {
exit('foo');
}
}
}

另外一个注意事项 - 我相信该方法总是在静态上下文中执行,即使它是在实例上调用的。如果我错了,我很高兴得到纠正。

关于php - 为什么 PHP 在对象上下文中使用静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14382206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com