簡體   English   中英

為什么PHP會將上下文分配給靜態方法調用而沒有給出E_STRICT通知?

[英]Why does PHP assigns context to a static method call and does not give an E_STRICT notice?

我在PHP5.4(在5.5中也出現)中遇到了一些非常奇怪的行為。 基本上,我是靜態地調用一個非靜態方法,並且我沒有得到我肯定應該得到的E_STRICT錯誤。

<?php
error_reporting(E_ALL);
class A
{
    public function iAmNotStatic() {}
}

現在,如果我這樣做:

A::iAmNotStatic();

然后,我得到了預期的Strict standards: Non-static method A::iAmNotStatic() should not be called statically錯誤Strict standards: Non-static method A::iAmNotStatic() should not be called statically

而且,如果我從對象上下文進行調用,也會收到相同的錯誤(如預期的那樣)

class B 
{
    public function __construct() {
        A::iAmNotStatic();
    }
}

$b = new B(); // error here, as expected

但是,如果我這樣做(將A指派為B的父母):

class B extends A
{
    public function __construct() {
        A::iAmNotStatic();
    }
}

$b = new B(); // no error 

然后PHP決定“沒問題,我有一個具有相同父類(A)的對象($ b),讓我們將其作為iAmNotStatic的上下文”。

那么,這是一個功能還是一個錯誤,這種令人困惑的(未記錄的)行為的目的可能是什么? 謝謝 :)

在第一種情況下,您沒有對象上下文,因為您是從外層空間調用非靜態方法的。 但是在第二種情況下,您具有對象上下文,因為$this將引用B實例-因此,PHP將發現對象上下文存在,因此,它是非靜態方法的非靜態調用(所有內容都是好)。 如果您對通過::呼叫猶豫不決,那么我想,您應該提醒一下,例如parent::method()是有效的呼叫。 即引用方式不是這里的問題。

更加具體:

class A
{
   public function foo()
   {
      echo('foo called, class: '. get_class($this).PHP_EOL);
   }
}

class B extends A
{
   public function __construct()
   {
      A::foo();
   }
}

$b=new B(); //foo called, class: B 

因此自foo()繼承以來,您將按預期看到類B

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM