2017-01-25 31 views
2

我試圖做的是以下幾點:PHP:調用一個實例的靜態類中實例的私有方法

class A { 

    public function __construct($a) { 
    // stuff here 
    } 

    public static function request() { 
    $instance = new self("hi"); 
    $instance->bye(); // this weirdly only sometimes throws errors 
    } 

    private function bye() { 
    // stuff here 
    } 

} 

A::request(); 

的關注線是$instance->bye() - 這是允許的靜態範圍內的方式,但是當調用一個實例,並在構造函數相同的類內?或者這通常不是一個好習慣?奇怪的是,這隻會在調用沒有上下文的私有方法時拋出錯誤。

任何幫助表示讚賞!

+0

http://php.net/manual/en/language.oop5.visibility .php#如果拉nguage.oop5.visibility-other-objects – Federkun

+0

我無法重現錯誤。你使用的是什麼版本的PHP? – wogsland

+0

@wogsland發佈的評論 - 顯然這是由於PHPStorm調試 – Sasha

回答

0

原來,這是罰款和PHPStorm調試是創造的問題,並因此搞砸了的情況下,爲什麼錯誤只發生有時這顯然發生在我們的系統_(ツ)_ /¯

+0

Ahhh中加入了這個說明,這很有道理。 – wogsland

-1

呼叫從一個靜態方法一個普通的方法不應該做。

由於可能存在根本沒有實例(例如:直接調用A::request()),它會拋出一個錯誤。
靜態方法將是類的所有實例相同,所以將不能訪問非靜態屬性。

什麼可能,但不應該做的是調用同一類型從一個靜態方法私有方法的對象

<?php 
class A { 
    private function foo() 
    { 
     print("bar"); 
    } 

    static public function bar($a) 
    { 
     $a->foo(); 
    } 
} 

$a = new A(); 

A::bar($a); 
?> 

http://php.net/manual/en/language.oop5.visibility.php

+1

我沒有,這是一個一般的規則(你的例子)。這些類應該是相同的類型。 – Andreas

+0

你是對的,在回答 – Antony

相關問題