2

クラス内のメソッドにアクセスするには、2つの異なる方法があることを確認しました。動作に違いはありますか、それとも同じアクションの純粋に代替の構文ですか?

$a = new A();
$a->foo();

A::foo();
4

5 に答える 5

6

どちらか一方だけを使用することはできません。::は静的メソッドと変数->用ですが、インスタンス メソッドと変数用です。これは、C++ 構文から「着想を得た」ものです。

class A {
    public function __construct() {}
    public function foo() {}
}
$a = new A();
$a->foo();
// Or use the shorter "new A()->foo()";
//   It won't return typeof(A), it will return what foo() returns.
// The object will still be created, but the GC should delete the object

また

class A {
    public static function foo() {}
}
A::foo();

DCoderによると、::親メソッドの呼び出しに使用できますが、これは確かではありません。

class B {
    public function __construct() {}
    public function foo() {}
}
class A extends B {
    public function __construct() {
        // Code
        parent::__construct()
    }
    public function foo() {
        // Code
        parent::foo()
    }
}
于 2012-05-28T18:11:15.580 に答える
1

->クラス A からインスタンス化された特定のオブジェクトのメソッドにアクセスします。

::指定されたクラス(あなたの場合はクラス A )の静的メンバーを参照するスコープ解決演算子です。

クラス A( )から作成され->たオブジェクトのメソッドにアクセス$aいて、静的メソッドにアクセスしていることに気付いていない場合(静的メソッドはオブジェクトにアクセスする必要はありません)。$a = new A();::

例えば。

Math静的メソッドを持つという名前のクラスがあるとしAdd()ます。

<?php
class Math{
// Note the 'static' keyword
public static function Add($arg1, $arg2){
return $arg1+$arg2;
}
}
?>

この場合、次のようAdd()にクラスのオブジェクトを作成する必要なく、メソッドをすぐに使用できます。Math

<?php
print Math::Add(2, 3);
?>

::シンボルを使用して、Mathクラスの静的メソッドにアクセスします。->クラスから作成されたオブジェクトのメソッドにアクセスするために使用されるため、symbolを使用しても意味がありません。

そう:

    <?php
    class Math{
    // Add() NO LONGER static
    public function Add($arg1, $arg2){
    return $arg1+$arg2;
    }
    }
?>

そして、代わりにこれを行う必要があります:

<?php
$object = new Math();
$result = $object->Add(2, 3);
print $result;
?>
于 2012-05-28T18:15:17.763 に答える
0

静的メソッドの場合は、foo()メソッドにアクセスします。それ以外の場合は、インスタンス メソッドを使用します。class::foo()foo()object-­>foo()

于 2012-05-28T18:10:08.153 に答える
0

::演算子を使用すると、クラスに静的にアクセスできます。この場合、オブジェクトとしてのクラスのインスタンスはありません。Singleton メソッドや Factory メソッドなど、さまざまな OOP 設計パターンで使用されます。これにアクセスできる範囲はほぼグローバルであり、自分が何をしているのかわからないと問題が発生する可能性があります。

-> 演算子の使用は、インスタンス化されたクラスのメソッドまたは変数にアクセスしていることを意味します。この場合、スコープはインスタンス化した特定のオブジェクト内にあり、そのグローバルステートを削除します。

于 2012-05-28T18:11:20.523 に答える