web-dev-qa-db-ja.com

PHP)の静的関数内のプライベートメンバーにアクセスする方法

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が苦手です。

そもそもできますか?

そうでない場合、静的関数内でメンバーにアクセスできるように、メンバーをどのように宣言する必要がありますか?

22
anon355079
class MyClass
{
  private static $MyMember = 99;

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

MyClass::MyFunction();

phpマニュアルのoop5の章の Visibility および Scope Resolution Operator(::) を参照してください。

65
VolkerK

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

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;
    }
  }
}
9
Michael

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

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

2
Arno
<?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(); 

?>
2
miku

静的または非静的?

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

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

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

プロパティ

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

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

メソッド

メソッドを静的にするか非静的にするかを決定するときは、簡単な質問をする必要があります。このメソッドは$thisを使用する必要がありますか?もしそうなら、静的として宣言されるべきではありません

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

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

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

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

0
DevWL