0

PHP のクラスはかなり新しいので、ご容赦ください。

class processRoutes
    {   
        //Next line works
        private $doc = "works as as string";
        //Next line does not work, "Parse error: syntax error, unexpected T_NEW"
        private $doc = new SimpleXMLElement('routingConfig.xml', null, true);
        private function getTablenames()
        {
            //do stuff  
        }
    }

いくつかのプライベート関数の中で、クラス内で SimpleXMLElement オブジェクトを最終的に利用しようとしています。これを行うための正しい方法は何ですか?現在の方法が機能しないのはなぜですか?

4

3 に答える 3

3

これはスクリプト解析のこの段階では評価できないため、コンストラクターでこれを行う必要があります。ただし、文字列、ブール値、数値などの「単純な」値は機能します。

class processRoutes
{   
  //Next line works
  private $doc = "works as as string";

  private $doc;

  public function __construct()
  {
     $this->doc = new SimpleXMLElement('routingConfig.xml', null, true);
  }

  // ....
}
于 2012-10-09T14:46:27.563 に答える
2

オブジェクトインスタンスでプロパティを初期化しようとしていますが、「コンパイル時」に決定できる定数でのみ変数を初期化できます。

PHPマニュアルから- プロパティ

この宣言には初期化が含まれる場合がありますが、この初期化は定数値である必要があります。つまり、コンパイル時に評価できる必要があり、評価されるために実行時の情報に依存してはなりません。

「実行時」の知識に依存する初期化は、いずれかを実行する必要があります。

  • で動作するコンストラクター(これを実装する方法については@Dan-Leeの回答を参照)で$this->doc
  • たとえば、コンストラクターから呼び出される「イニシャライザー」関数内から (コンストラクターから実行される可能性のある他の「実際の作業」と「初期化」ステップを区別するためにこれを行う場合があります)、または
  • クラスの消費者が手動で。消費者が操作する可能性があります
    • myProcessRoutes->doc = 'some other string'プロパティまたはオブジェクト (例: ) に直接、
    • オブジェクトへの関数呼び出しを介して、たとえば myProcessRoutes.initialise_doc('some other string')、または
    • オブジェクトのセッターを介して-PHPでこれらを使用したことがないので、それらを調査させてください! ;-)

(ただし、インスタンス化/コンストラクターより後に発生するこれらのアプローチが本当に初期化である場合は、議論の余地があります/哲学的です)。

クラス コンストラクタ/デストラクタのポイントは、必要に応じてオブジェクト インスタンスを初期化/破棄できる「フック」を提供することです。

例に従って、いくつかの特定の新しいインスタンスを作成する必要があるだけかもしれません。その場合、コンシューマーからコンストラクターへの入力を受け入れる必要はありません。

または、クラスを適切に設定するために、いくつかの値を受け入れる必要がある場合があります。これは、呼び出しているときに、上記のサンプルコードでまさに起こっていることです

private $doc = new SimpleXMLElement('routingConfig.xml', null, true);

(つまり'routingConfig.xml'nulltruein の値を の新しいインスタンスに渡してSimpleXMLElementいるため、このインスタンスのコンストラクターは、渡した値を使用してインスタンスを初期化し、すぐに使用できるようになります)。

于 2012-10-09T14:53:01.893 に答える
0

クラスの変数を参照したいときはいつでも、キーワード $this を使用してください

public function getTablenames()
{
    $my_new_variable = $this->doc; // Transfers the $doc variable
}
于 2012-10-09T14:48:10.530 に答える