所以我有这个问题,我可以静态调用对象方法,反之亦然。这是应该发生还是我做错了以防万一?
PHP版本:5.6.12 XAMPP版本:3.2.1
function endl()
{
echo "<br>";
}
class Base
{
public function objectFunc($msg)
{
echo "You called a non-static function from " . $msg;
endl();
}
public static function staticFunc($msg)
{
echo "You called a static function from " . $msg;
endl();
}
}
Base::objectFunc("a static call");
Base::staticFunc("a static call");
$base = new Base;
$base->objectFunc("a non-static call");
$base->staticFunc("a non-static call");
Here are the results from running this:
You called a non-static function from a static call
You called a static function from a static call
You called a non-static function from a non-static call
You called a static function from a non-static call
答案 0 :(得分:1)
这可以帮到你:
&#34;将类属性或方法声明为静态使它们可以访问而无需实例化类。声明为static的属性无法使用实例化的类对象访问(虽然静态方法可以)&#34;通过php.net
&#34;因为静态方法在没有创建对象实例的情况下是可调用的,所以伪变量$ this在声明为static的方法中不可用。
警告:在PHP 5中,静态调用非静态方法会生成E_STRICT级别警告。
警告:在PHP 7中,不推荐静态调用非静态方法,并将生成E_DEPRECATED警告。将来可能会删除对静态调用非静态方法的支持。 &#34;通过php.net
你的代码会起作用,但有警告,它取决于php版本。
答案 1 :(得分:0)
如果你把:
error_reporting(E_ALL);
ini_set('display_errors', '1');
在PHP 7.0中,您将收到以下消息: 不推荐使用:非静态方法Base :: objectFunc()不应在...中静态调用。
但请注意,这不是错误,而是“弃用”警告。此外,没有任何错误或警告:
$base->staticFunc("a non-static call");
这是PHP中一个古老的已知问题。 (这与PHP在PHP 4中的表现有关,并且转向PHP 5决定具有向后兼容性)
可能是因为这种行为已经很多年了,即使在PHP 7中它也没有被改变,尽管它是不合理的并且允许非常糟糕的编程习惯。你是对的,有一些可怕的错误。 PHP允许它,并不意味着任何不喜欢认可不良编程习惯的人应该以这种方式编程。