2017-04-26 118 views
5

据我所知,静态方法必须它们的类类型的实例对象,并因此的状态没有访问在error.But对象引用$this内他们的结果可以参考使用对象的静态方法构件操作者->PHP静态方法

$obj->staticMethod(); 

甚至可以通过参数传递它的状态。

$para1 = $obj->para1; 

$para2 = $obj->para2; 

$obj->staticMethod($para1, $para2); 

当静态环境中静态解析时,最后一个示例如何可能?如果有人能向我解释静态代码在php代码中的一般行为。你甚至可以谈谈C相关的概念,如果它会帮助。

+0

密切相关:[如果我以非静态方式调用静态方法?](// stackoverflow.com/q/12874376/962603) –

+2

将静态方法看作是使用时髦句法。类静态成员也是如此。唯一使它们与全局对象(函数,变量)不同的是可见性说明符(protected,private)。 – axiac

回答

1

由于您声明您已经了解static的含义,因此我会跳过该说明。

但是,引用PHP的documentation on the static keyword可能仍然很好。特别是以下两个警报很重要(真的很难看清楚)。

注意      在PHP 5,调用非静态方法静态生成E_STRICT级警告。

而这一个(斜体强调我的)。

警告      在PHP 7,调用非静态方法静态已过时,会产生E_DEPRECATED警告。 支持静态调用非静态方法将来可能会被删除。

因此,削减长话短说:是的,你的榜样将运行(现在),因为PHP解释器将尝试修复你的错误你。你应该永远不要这样做。 PHP解释器将做什么是:

说你的$objFoo类型。然后,它会读取

$obj->staticMethod($para1, $para2); 

断定staticMethodstatic,而是执行

Foo::staticMethod($para1, $para2); 

这当然是完全正常的通过,是Foo实例的性能参数。 staticMethod参数来自哪里并不重要。


更详细地说明了一下,为什么这个作品,而在static方法使用$this是不允许的。

您可以将常规方法看作static函数,它们有一个额外的功能:它们收到一个隐式参数$this$this的值仅仅是调用该方法的对象。因此,$obj->do($a, $b, $c)相当于拨打Foo::do($obj, $a, $b, $c)并命名为do,$this的第一个参数。这很方便,因为我们现在可以轻松定义在对象实例上工作的方法,而无需一遍又一遍地重复说明此实例是我们方法的参数。大。

现在回到static的功能。与普通方法唯一的区别是它们不会收到这个隐含的$this参数。因此,在他们里面使用$this是无效的。不是因为它被禁止,而是因为它没有引用任何东西。 PHP没有(也不能)知道$this应该指向什么。

另一种方法来看看它。说我们的Foo类有两个属性:$para1$para2,两个数字。假设你写了一个方法返回这些数字的总和。一种方法是做到这一点:

public static function sum($para1, $para2) { 
    return $para1 + $para2; 
} 

很好。作品。然而,它是这样称呼它是讨厌的

$sum = Foo::sum($obj->para1, $obj->para2); 

所以,这是什么方法是!

public function sum(/* implicit $this parameter */) { 
    // write looking up the properties once inside the function, instead 
    // of having to write it every time we call the function! 
    return $this->para1 + $this->para2; 
} 

// ... 

$sum = $obj->sum(); // $obj is passed implicitly as $this 

因为静态函数不接受隐$this参数,使用$this它们的内部就像是试图使用$undefined当你从来没有定义它。因此,无效。

+0

可以肯定地说,静态数据比手动可以存档的文件要多得多。 –

+0

@CholthiPaulTtiopic我相信手册是相当完整的,但事实上,他们本可以强调这一点。这是否回答你的问题?我很乐意详细说明。 –

+0

我还是不明白为什么PHP在静态方法内禁止'$ this',同时允许我们仍然像上面的例子那样做东西。 –

0

静态装置用简单的术语类成员,A 静态数据成员是不论被创建或不对象的类内访问静态功能也是致力于整个班级的功能。静态函数只能处理静态数据,有时可能会有所不同。尽管静态是专用的,但您可以使用对象访问它们。它允许所有语言。为什么?由于可行性。如果一个对象无法访问静态成员,那就是一个限制。