Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中访问静态函数中的私有成员_Php_Class_Static_Private_Member - Fatal编程技术网

如何在PHP中访问静态函数中的私有成员

如何在PHP中访问静态函数中的私有成员,php,class,static,private,member,Php,Class,Static,Private,Member,我有以下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

我有以下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

首先你能做到吗

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

class MyClass
{
  private static $MyMember = 99;

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

MyClass::MyFunction();

请参阅php手册的oop5章节和。

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


这在。

中有明确的说明。这是一个非常晚的回复,但可能会对某人有所帮助

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;
    }
  }
}
静态还是非静态? 你有没有问过自己这个问题

您不能从内部访问非静态参数/方法 静态方法(至少不使用依赖项注入) 但是,您可以在非静态方法中使用访问静态属性和方法(使用
self::

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

private static $objectCreatedCount; // this property is assign to class blueprint
private $objectId; // this property is assign explicitly to class instance
方法 当决定一个方法是静态的还是非静态的时,你需要问自己一个简单的问题。此方法是否需要使用
$this
?如果是,则不应将其声明为静态

private static $objectCreatedCount; // this property is assign to class blueprint
private $objectId; // this property is assign explicitly to class instance
仅仅因为你不需要$this关键字就不需要了 自动意味着您应该使某些内容保持静态(尽管 反之亦然:如果您需要$this,请将其设置为非静态)

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

好的实践是,如果特定的美国案例变得非常清楚,总是开始将类设计为非静态和强制静态

您可以尝试将参数声明为静态。。。这样您就可以从静态方法访问它,但这通常不是您想要做的。
因此,如果您确实需要从静态方法访问
$this
,那么这意味着您需要重新思考/重新设计您的类架构,因为您做得不对。

+1-我不知道self关键字。你的代码成功了!谢谢:)你能调用
$m->MyFunction()吗如果你像案例A)那样声明变量并像
echo$MyMember
那样使用它,它对我不起作用。它不应该正常工作?我无法理解您的注释-
//local
。据我所知,当您使用“echo$MyMember;”时,它指的是变量的“local scope”(这里是函数),因为我们没有在函数中定义任何“$MyMember”,所以这一行“没有任何结果”…哦!由于您没有提到任何致命错误或其他问题,我认为它会起作用:D.+1,因为需要花时间解释所有案例:)相关: