所以我有一个问题,我可以静态地调用一个对象方法,反之亦然。这是应该发生的还是万一我做错了什么?
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发布于 2016-01-21 16:56:45
这能帮到你:
“将类属性或方法声明为静态使它们可以访问,而不需要类的实例化。声明为静态的属性不能使用实例化的类对象(,虽然静态方法可以)来访问。”
“因为静态方法在没有创建对象实例的情况下是可调用的,因此伪变量$this在声明为静态的方法中不可用。
注意:在PHP 5中,调用非静态方法静态地生成E_STRICT级别警告。
警告:在PHP7中,静态调用非静态方法是不可取的,并将生成E_DEPRECATED警告。对静态调用非静态方法的支持在将来可能会被删除。“由php.net
您的代码会正常工作,但是对于警告,它取决于php版本。
有关更多信息,请参见:http://php.net/manual/en/language.oop5.static.php
发布于 2016-01-21 19:27:31
如果你说:
error_reporting(E_ALL);
ini_set('display_errors', '1');在PHP7.0中,您将得到以下消息:de推荐:非静态方法库::objectFunc()不应在.
但请注意,这不是一个错误,而是一个“不推荐”的警告。此外,也没有错误或警告来自:
$base->staticFunc("a non-static call");这是PHP中一个已知的老问题。(它必须做的是PHP在PHP 4中的应用,然后迁移到PHP 5,决定向后兼容)
也许是因为这种行为已经存在很多年了,它甚至在PHP 7中都没有被改变过,这是不合理的,并且允许非常坏的编程习惯。你是对的PHP允许这样做,并不意味着任何不喜欢认可不良编程习惯的人都应该以这种方式编程。
https://stackoverflow.com/questions/34929264
复制相似问题