所以在PHP中你可以拥有
Class A{
function B(){}
}
你可以把它称为静态函数:
A::B();
我的问题是......如果我能做到这一点,那么我为什么要将函数B()声明为静态,因为这样做会使$ this不可用,所以灵活性较差,所以你有一切都要输,但没有什么可以增益...
还是有一个优点,即将该函数声明为静态,我不知道?
我也听说过“非静态方法的静态调用”被“弃用”了......这与这种情况有什么关系呢?当B()没有被声明为静态的东西时,我不应该调用A::B()
吗?如果是这样,为什么会这样呢?
答案 0 :(得分:11)
因为PHP在严格性(?)方面往往有点松散 - 这些东西都有效。它们被弃用的事实意味着在将来的版本中,很可能不可以继续工作。因此,如果您在静态上下文中调用非静态函数,则您的程序可能会在将来的PHP升级中中断。
至于现在使用它 - 将函数声明为静态的优点是你正在决定应该如何使用该函数。如果您打算在静态上下文中使用某个函数,那么无论如何都不能使用$ this,因此您最好只清楚自己打算做什么。如果要静态使用该功能,请将其设置为静态。如果你不这样做,那就不要了。如果您想静态和非静态地使用某个功能,请重新检查您的要求:P
答案 1 :(得分:1)
用于兼容模式。现在,静态调用非静态方法会生成E_STRICT级别警告。
为什么静态而不是实例化对象?每个程序员都会告诉你一个原因。我特别喜欢使用静态方法实例化对象。它清晰,可追溯,更可重复使用。
我做了一个测试工作台,实例化和调用方法之间的差异最小,而不是静态调用它。
提示:如果您预见到调用方法也会静态定义它们; - )
答案 2 :(得分:1)
首先,你不能用像Java这样的严格类型的语言在你的帖子中做类似的事情。如果在静态上下文中调用非静态内容,则Java代码无法编译。 PHP对这些事情并没有那么严格(但是),但你仍然不应该仅仅因为你可以做,尽管这是不好的做法,在某些语言中甚至是“不正确的”练习。
使用静态方法肯定有优点。你没有获得任何东西甚至失去灵活性是不对的。我们举个例子:
class A {
private static $prop_a = 'property_a';
public static function b() {
echo 'called b()';
echo self::$prop_a;
$A = new A();
$A->c();
}
public function c() {
echo 'called c()';
}
}
现在我们可以这样调用这个类:
A::b();
输出
但你也可以这样做:
$a = new A();
$a->b();
$a->c();
c()
现在执行了两次,但你明白了。在你的班级中,你可以实现类本身,并像使用常规对象一样使用它。但是从外部来看,它只是一行代码,而它是使用非静态方式的3行。很酷,对吧?
如您所见,您可以在非静态上下文中使用静态函数,这意味着您可以将方法声明为静态,但是如果您实例化了类,则可以像普通方法一样调用它。听起来很灵活;)
不,你不能在静态上下文中使用$this
,但这就是self
的用途;)
答案 3 :(得分:-3)
如果它是静态函数,则不必实例化该类以使用该方法。
Class A {
static function hello($arg)
{
echo 'Hello, ' . $arg;
}
}
A::hello('world');
VS
Class A {
public function hello($arg)
{
echo 'Hello, ' . $arg;
}
}
$a = new A;
$a->hello('world');
这里重要的是对象的实例化。在实例化对象之后,可以对其进行操作,并且调用方法可能会产生意外结果。如果您的值和函数在类中静态声明,则在调用函数时无法修改它们。
这并不是说你应该总是使用静态方法。采取以下示例。
class My_math {
static function pi()
{
return 3.14
}
}
class My_bakery {
private var $pie;
function set_pie($pie)
{
$this->pie = $pie;
}
function pie()
{
echo "I made you a " . $this->pie . "pie";
}
}
我已经让My_Math返回一个常量值,因为我知道pi不会改变。但是在My_bakery中,有些日子我想要蓝莓派,有些日子我想要桃子派。