【问题标题】:How to access a private member inside a static function in PHP如何在 PHP 中访问静态函数内的私有成员
【发布时间】:2023-03-14 04:05:01
【问题描述】:

我在 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 方面不太强。

你能做到吗?

如果不是,我应该如何声明该成员以便我可以在静态函数中访问它?

【问题讨论】:

标签: php class static private member


【解决方案1】:
class MyClass
{
  private static $MyMember = 99;

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

MyClass::MyFunction();

参见php手册的oop5章节中的VisibilityScope Resolution Operator (::)

【讨论】:

  • +1 - 我不知道 self 关键字。你的代码有效!谢谢:)
【解决方案2】:

这是一个超级迟到的回应,但它可能对某人有所帮助..

class MyClass
{
  private $MyMember;

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

这行得通。您可以通过这种方式访问​​私有成员,但如果您有 $class,您应该只将 MyFunction 设为该类的方法,就像您只需调用 $class->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;
    }
  }
}

【讨论】:

    【解决方案3】:

    在静态方法中,您不能使用$this 调用变量,因为静态方法是在“实例上下文”之外调用的。

    PHP doc里有明确说明。

    【讨论】:

      【解决方案4】:
      <?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(); 
      
      ?>
      

      【讨论】:

      • 如果函数是静态的,你能像这样调用$m-&gt;MyFunction();吗?
      • 是的,您可以,但也许您不应该这样做,因为它掩盖了函数是对象绑定的事实..
      • 很奇怪。我认为您只能通过 ClassName::FunctionName 而不是实例化来调用静态函数。无论如何,我有这个疑问-> 如果您像案例 A) 那样声明变量并像 echo $MyMember 一样使用它,它对我不起作用。它不应该工作吗?我无法理解您的评论 - //local 那里。
      • 据我所知,当您使用“echo $MyMember;”时,它指的是变量的“本地范围”(这里是函数),并且由于我们没有定义任何"$MyMember" 在函数中,这一行产生 "nothing" ...
      • 哦!由于您没有提到任何致命错误或其他内容,我认为它会起作用:D。 +1 花时间解释所有案例:)
      【解决方案5】:

      静态还是非静态?

      你有没有问过自己这个问题?

      你不能从内部访问非静态参数/方法 静态方法(至少不使用依赖注入)

      您可以通过非静态方法(self::)访问静态属性和方法

      属性

      特定的属性值是分配给类蓝图还是分配给它的实例(从类创建的对象)? 如果该值与类实例(类对象)不紧密那么您可以将其声明为静态属性

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

      方法

      在决定将方法设为静态还是非静态时,您需要问自己一个简单的问题。这个方法需要使用$this吗?如果是,则不应将其声明为静态

      仅仅因为你不需要 $this 关键字并不 自动意味着你应该做一些静态的东西(虽然 反之亦然:如果您需要 $this,请将其设为非静态)。

      您是在一个单独的对象上还是在一般的类上调用此方法?如果您不确定要使用哪一个,因为两者都适用于特定用例,那么请始终使用非静态。它将为您提供更多的灵活性。

      好的做法是总是开始将你的类设计为非静态的,如果我们的特定情况变得非常清楚,则强制使用静态。

      您可以尝试将您的参数声明为静态...只是这样您就可以从静态方法访问它,但这通常不是您想要做的。 所以如果你真的需要从静态方法访问$this,那么这意味着你需要重新考虑/重新设计你的类架构因为你做错了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-04
        • 2016-11-29
        • 1970-01-01
        • 2020-03-22
        • 2018-01-07
        • 2014-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多