2017-01-25 18 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()である - これはAの静的コンテキスト内で許可されていますインスタンスで呼び出され、コンストラクタと同じクラスの内部にある場合それとも、これは一般的に良い習慣ではないのですか?これは、文脈のないプライベートメソッドを呼び出しているときにだけエラーをスローするのは奇妙です。

+0

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

+0

エラーを再現できません。あなたはどのPHPのバージョンを使用していますか? – wogsland

+0

@wogslandはコメントを投稿しました - 明らかに、PHPStormのデバッグによるものでした – Sasha

答えて

0

から

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

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

$a = new A(); 

A::bar($a); 
?> 

すると、これは罰金とPHPStormデバッガで判明問題が発生してコンテキストが不正になっていたため、システムで明らかにエラーが発生したのはなぜですか?

+0

ああ、意味があります。 – wogsland

-1

静的メソッドからの通常のメソッドの呼び出しは、決して実行しないでください。

インスタンスが一切存在しない場合(例:A::request()を直接呼び出す)、エラーが発生します。
静的メソッドは、クラスのすべてのインスタンスで同じになるため、非静的プロパティにアクセスすることはできません。

何でしたが、行うべきではありません静的メソッドから同じ型のオブジェクトプライベートメソッドを呼び出している:http://php.net/manual/en/language.oop5.visibility.php

+1

これは一般的なルール(あなたの例)ではありません。クラスは同じ型でなければなりません。 – Andreas

+0

あなたは正しいです、答えにこの明確化を加えました – Antony

関連する問題