2013-03-12 19 views
7

最近、私はPHPゲームを強化しています。 JavaScriptから来て、オブジェクトモデルが少し分かりやすいとわかりました。PHPプロパティのアクセスとドル記号

私はいくつかの不具合にぶつかって、私がドキュメントで見つけられないようなことを明確にしたいと思っていました。使用せずに

class myClass { 

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

} 

我々は(myClass$myClassという変数で参照されていると仮定して)使用してアクセスすることができます$myPropのパブリック変数で$myClass->myProp:PHPのクラスを定義するとき、あなたはそのようなプロパティを定義することができ

ドル記号の

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

質問:なぜドル記号は::で、->では使用できないのですか?

EDIT

これは私が仕事(およびない)であろうと仮定するコードである。

class SethensClass { 

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

} 

$myClass = new SethensClass; 
echo $myClass::$SethensProp; 
+1

興味深い... 1つのupvoteと1つのクローズリクエスト。 – Sethen

+0

[あなたの他の質問](http://stackoverflow.com/q/17681253/20578)についてのコメントをお寄せいただきありがとうございます(個人的な質問のシリーズとして尋ねられた場合、私は個人的にはうまくいったと思います。http: //stackoverflow.com/questions/15270843/what-does-plus-operator-mean-in-underscore-js)でも、「ベストプラクティスはこれを行うと言います」と言っても意味がありません。あなたが何かが "ベストプラクティス"だと思う理由を説明できないのであれば、それが "ベスト"であることをどのように知っていますか?異なる状況では、さまざまなことが最良です。 –

+0

@ PaulD.Waiteいいですね。開発を進めようとする開発者として、特定の図書館がベストプラクティスに従って学習するかどうかについて質問することは、私の心の中で受け入れられます。大規模なコミュニティではそれをサポートしていないため、非常にイライラしています。私は、特定の図書館がベストプラクティスを使って書かれたとは思っていません。私はそれが私が間違っていないことを確認しようとしています。 – Sethen

答えて

14

class constant::スコープオペレータでアクセスされず、ないドル記号、そう静的なクラスのプロパティとクラスの定数を区別するためには$が必要です。

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; 
+0

+1は私にそれを打ちました –

+0

'$ myClass'は' $ myClass = new myClass'を表すはずです。 – Sethen

+0

あなたは理にかなっていません。 $ staticPropはインスタンス変数ではなくクラス変数であるため、クラスインスタンスによって呼び出すことはできません。 @LimH。 –

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の関数の例を()を呼び出しますが、私たちは$ A->例()または同様の書き込みができないように、クラスAのないオブジェクトは、ありません。代わりにexample()を 'クラス関数'と呼びます。つまり、そのクラスのオブジェクトではなく、クラス自体の関数として呼びます。

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

上記の例では、クラスBは関数example()を再定義します。 :: - 演算子を使用してクラスAのexample()の実装を特に参照している場合を除き、クラスAの元の定義はシャドーイングされ、使用できなくなりました。これを行うにはA :: example()を記述します(実際にはparent :: example()を記述する必要があります)。

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

関連する問題