9

最近、PHP ゲームを強化しています。JavaScript から来たので、オブジェクト モデルの方が理解しやすいことがわかりました。

ドキュメントで見つけられないように見えるいくつかの明確化が必要ないくつかの癖に遭遇しました。

PHP でクラスを定義する場合、次のようにプロパティを定義できます。

class myClass {

    public $myProp = "myProp";
    static $anotherProp = "anotherProp";

}

のパブリック変数を使用すると、ドル記号を使用せずに (という変数で が参照されていると$myProp仮定して) アクセスできます。myClass$myClass$myClass->myProp

を使用してのみ静的変数にアクセスできます::$myClass::$anotherPropしたがって、ドル記号のように静的変数にアクセスできます。

質問は、なぜドル記号を使用する必要があるのです::->??

編集

これは、私が動作すると仮定するコードです (実際に動作します):

class SethensClass {

    static public $SethensProp = "This is my prop!";

}

$myClass = new SethensClass;
echo $myClass::$SethensProp;
4

2 に答える 2

18

クラス定数::スコープ演算子でアクセスされ、ドル記号は使用されないため$、静的クラス プロパティとクラス定数を区別するためにが必要です。

class myClass {
  public static $staticProp = "static property";

  const CLASS_CONSTANT = 'a constant';
}

echo myClass::CLASS_CONSTANT;
echo myClass::$staticProp;

したがって、変数にアクセスするには、$が必要です。ただし、変数をクラス名として使用することもできるため、パーサーがクラス名を識別できなかったため$、クラス名の先頭に を配置することはできません。$myClass::staticPropしたがって、プロパティに添付する必要があります。

$myClass = "SomeClassName";
// This attempts to access a constant called staticProp
// in a class called "SomeClassName"
echo $myClass::staticProp;

// Really, we need
echo myClass::$staticProp;
于 2013-03-12T16:35:55.287 に答える
0

その貪欲!

基本クラスの関数や変数を参照したり、まだインスタンスを持たないクラスの関数を参照したりすると便利な場合があります。これには :: 演算子が使用されています。

<?php
class A
{
    function example()
    {
        echo "I am the original function A::example().<br>\n";
    }
}

class B extends A
{
    function example()
    {
        echo "I am the redefined function B::example().<br>\n";
        A::example();
    }
}

// there is no object of class A.
// this will print
//   I am the original function A::example().<br>
A::example();

// create an object of class B.
$b = new B;

// this will print 
//   I am the redefined function B::example().<br>
//   I am the original function A::example().<br>
$b->example();
?> 

上記の例では、クラス A で関数 example() を呼び出していますが、クラス A のオブジェクトがないため、$a->example() などを記述できません。代わりに、example() を「クラス関数」として呼び出します。つまり、そのクラスのオブジェクトではなく、クラス自体の関数として呼び出します。

クラス関数はありますが、クラス変数はありません。実際、呼び出し時にはオブジェクトはまったくありません。したがって、クラス関数はオブジェクト変数を使用できず (ただし、ローカル変数とグローバル変数を使用できます)、$this をまったく使用できません。

上記の例では、クラス B が関数 example() を再定義しています。::-operator を使用してクラス A の example() の実装を具体的に参照しない限り、クラス A の元の定義はシャドウされ、使用できなくなります。これを行うには、A::example() を記述します (実際には、parent::example() を記述する必要があります)。

このコンテキストでは、現在のオブジェクトがあり、オブジェクト変数を持つ場合があります。したがって、WITHIN オブジェクト関数から使用する場合、$this およびオブジェクト変数を使用できます。

于 2013-03-12T16:38:21.343 に答える