3

重複の可能性:
PHP: self と $this

$this:: プレフィックスでクラス メソッドを呼び出せることがわかりました。例:

class class1 {
    public function foo()
    {
        echo "1";
    }
    public function bar()
    {
        $this::foo();
        //in this example it acts like $this->foo() and displays "2"
        //using self::foo() displays "1"
    }
}

class class2 {
    public function foo()
    {
        echo "2";
    }
    public function bar()
    {
        class1::bar();
    }
}

$obj = new class2();
$obj->bar(); // displays "2"
class1::bar(); // Fatal error

$this-> と $this:: プレフィックスを使用してメソッドを呼び出すことの違いを知りたいです。

ps: $this->foo() と self::foo() の違いに関するページがこのリンクにあります: $this で self を使用する場合は?

4

2 に答える 2

6

あなたがリンクした答えは、あなたが探しているものを正確に教えてくれます;)。

基本的に、プログラミング言語には、オブジェクトとクラスという 2 つの概念を区別するのに苦労する人がいます。

クラスは抽象です。オブジェクトの構造を定義します。オブジェクトがそのクラスから構築された場合に、オブジェクト含まれるプロパティとメソッド。オブジェクトの作成は、 を呼び出すときに行うことですnew class1()。これは、class1 クラスのすべてのプロパティとメソッドを含む新しいオブジェクトを作成するように PHP に指示しています。

オブジェクトを作成する際に注意すべき重要なことは、オブジェクトにも独自のスコープがあることです。これは、実際に $this と static:: (注: self:: または $this:: を使用しないでください。static:: を使用してください (これについては後で詳しく説明します) ) が登場する場所です。Using$thisは、現在のオブジェクトのプロパティとメソッドにアクセスするように PHP に指示することです。Usingstatic::とは、オブジェクトの構築元である基本クラスのプロパティとメソッドにアクセスするように PHP に指示することです。

次に例を示します。

class MyClass {
    public $greeting;
    public static $name;

    public greet() {
        print $this->greeting . " " . static::$name;
    }
}

$instance1 = new MyClass();
$instance1->greeting = 'hello';

$instance2 = new MyClass();
$instance2->greeting = 'hi';

MyClass::$name = 'Mahoor13';

$instance1->greet();
$instance2->greet();

上記はテストしていませんが、次の結果が得られるはずです。

こんにちは Mahoor13 こんにちは Mahoor13

これにより、クラス プロパティの設定とインスタンス プロパティの設定の違いについての一般的な考え方が得られるはずです。さらにサポートが必要な場合はお知らせください。

編集

$this:: は、PHP がスコープを処理する方法の副作用のようです。私はそれが有効だとは考えませんし、私はそれを使用しません。いかなる方法でもサポートされていないようです。

于 2012-11-12T14:19:00.697 に答える
5

$this->はinstance から呼び出されるため、この呼び出しを使用するにはオブジェクトのインスタンスが必要です。

しかし、$this::はクラス内の静的メソッドであり、インスタンスなしで呼び出すことができるため、クラスのインスタンスを割り当てる必要はありません

myclass::doFoo();
public static function doFoo(){ .... }

do 関数は、このように呼び出す静的関数である必要があります。そうしないと、php が新しいバージョンでエラーを返します。

于 2012-11-12T14:14:36.937 に答える