1

PHP では、クラス名が有効なオブジェクトまたは文字列である限り、静的メンバーまたは関数にアクセスできます。これはほとんど真実です。クラス名の文字列がオブジェクトのプロパティである場合、直接使用することはできません。静的メンバーへのアクセスに使用する前に、単純変数にコピーする必要があります。次に例を示します。

class Foo {
  protected $otherclass='Bar'; //string!

  function out(){
    $class=$this->otherclass;
    echo $class::ALIAS;  //Where everyone knows your name.
  }

  function noout_err(){
    echo $this->otherclass::ALIAS; //syntax error, unexpected '::' 
  }
}

class Bar {
  const ALIAS='Where everyone knows your name.'
}

この癖は、しばらくの間私を悩ませてきました。だから私は疑問に思っていました:

  • これは OOP 言語間で共通の制限ですか?
  • PHP の内部構造に精通している人は、$this->classname::somefunction()構文が望ましくない理由を説明できますか?

これは、「php sux のため」というコメントの嵐を引き起こすことを意図したものではありません。私はその言語の特徴をよく知っています。「そのように成長した」以外に、これに理由があるかどうかを知りたいだけです。

4

2 に答える 2

3

これは確かに制限であり、それには理由があります。スコープ演算子は、次のことを意味する::よりも優先されます。->

$this->otherclass::ALIAS;

次のように読み取られます。

($this->(otherclass::ALIAS));

したがって、エラーが発生します。

これは、実際には PHP がおそらくC++ に継承した機能です。

于 2013-02-11T14:46:54.183 に答える
1

ええ、これはできません。明確な理由はありません。簡単な回避策があることをすでに示したこの極端なエッジケースに対応するために、文法を台無しにする構文はまったくありません。

私はそれを「限界」とまでは言いませんし、決して「癖」ではありません。PHP もパンを焼くことはできません。

実際、コードを見た場合$this->classname::somefunction()、すぐに直感的に理解できますか? いや。あなたがこれをすることができないのは良いことです。

于 2013-02-11T14:44:26.913 に答える