29

私はPHPで次のクラスを持っています

class MyClass
{
  // How to declare MyMember here? It needs to be private
  public static function MyFunction()
  {
    // How to access MyMember here?
  }
}

どの構文を使用するかについて完全に混乱しています

$MyMember = 0;echo $MyMember

また

private $MyMember = 0;echo $MyMember

また

$this->MyMember = 0;echo $this->MyMember

誰かがそれを行う方法を教えてもらえますか?

私はOOPSが苦手です。

そもそもできるんですか?

そうでない場合、静的関数内でアクセスできるようにするには、どのようにメンバーを宣言すればよいですか?

4

5 に答える 5

82
class MyClass
{
  private static $MyMember = 99;

  public static function MyFunction()
  {
    echo self::$MyMember;
  }
}

MyClass::MyFunction();

PHP マニュアルの oop5 の章にある可視性スコープの解決演算子 (::)を参照してください。

于 2009-12-24T09:59:46.513 に答える
11

これは非常に遅い応答ですが、誰かを助けるかもしれません..

class MyClass
{
  private $MyMember;

  public static function MyFunction($class)
  {
    $class->MyMember = 0;
  }
}

それはうまくいきます。この方法でプライベート メンバーにアクセスできますが、$class がある場合は、$class->MyFunction() を呼び出すだけなので、MyFunction をクラスのメソッドにする必要があります。ただし、この静的関数がアクセスして反復処理し、すべてのインスタンスを更新できるクラスコンストラクターに各インスタンスが追加される静的配列を持つことができます。つまり..

class MyClass
{
  private $MyMember;
  private static $MyClasses;

  public function __construct()
  {
    MyClass::$MyClasses[] = $this;
  }

  public static function MyFunction()
  {
    foreach(MyClass::$MyClasses as $class)
    {
      $class->MyMember = 0;
    }
  }
}
于 2011-02-18T06:31:13.857 に答える
4

静的メソッド内では、変数を使用して呼び出すことはできません$this。静的メソッドは「インスタンス コンテキスト」の外で呼び出されるためです。

PHP docに明確に記載されています。

于 2009-12-24T10:02:52.053 に答える
3
<?php
    class MyClass
    {
        // A)
        // private $MyMember = 0;

        // B)
        private static $MyMember = 0;

        public static function MyFunction()
        {
            // using A) //  Fatal error: Access to undeclared static property: 
            //              MyClass::$MyMember
            // echo MyClass::$MyMember; 

            // using A) // Fatal error: Using $this when not in object context
            // echo $this->MyMember; 

            // using A) or B)
            // echo $MyMember; // local scope

            // correct, B) 
            echo MyClass::$MyMember;
        }
    }

    $m = new MyClass;
    echo $m->MyFunction();
    // or better ...
    MyClass::MyFunction(); 

?>
于 2009-12-24T10:08:27.890 に答える
1

静的または非静的?

この質問をしたことがありますか?

静的メソッド内から非静的パラメーター/メソッドにアクセスすることはできません (少なくとも依存性注入を使用しないと)。

ただし、非静的メソッド ( with self::)から静的プロパティとメソッドにアクセスできます。

プロパティ

特定のプロパティ値がクラス ブループリントに割り当てられているか、それともインスタンス (クラスから作成されたオブジェクト) に割り当てられているか? 値がクラス インスタンス (クラス オブジェクト) に厳密でない場合は、それを静的プロパティとして宣言できます

private static $objectCreatedCount; // this property is assign to class blueprint
private $objectId; // this property is assign explicitly to class instance

メソッド

メソッドを静的にするか非静的にするかを決定するときは、簡単な質問を自問する必要があります。このメソッドを使用する必要があります$thisか? 存在する場合は、static として宣言しないでください

また、$this キーワードが必要ないからといって、自動的に何かを静的にする必要があるというわけではありません (ただし、逆は真です: $this が必要な場合は非静的にします)。

このメソッドを 1 つの個別のオブジェクトで呼び出していますか、それともクラス全体で呼び出していますか? どちらも特定のユースケースに適しているためにどちらを使用すればよいかわからない場合は、常に非静的を使用してください。これにより、将来の柔軟性が向上します。

特定のケースが非常に明確になった場合は、常にクラスを非静的として設計し、強制的に静的にすることをお勧めします。

パラメータを静的として宣言しようとすることもできます...静的メソッドからアクセスできるようにするためですが、通常、それはやりたいことではありません。したがって、静的メソッドから本当にアクセスする必要がある場合は、間違っているため$this、クラスアーキテクチャを再考/再設計する必要があることを意味します。

于 2019-08-01T22:42:21.263 に答える