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 章节中的Visibility and Scope Resolution Operator (::)

于 2009-12-24T09:59:46.513 回答
11

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

class MyClass
{
  private $MyMember;

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

这样可行。您可以通过这种方式访问​​私有成员,但如果您有 $class,您应该只将 MyFunction 设为该类的方法,就像您只需调用 $class->MyFunction() 一样。但是,您可以有一个静态数组,每个实例都添加到类构造函数中,该静态函数可以访问和迭代,更新所有实例。IE..

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,请将其设为非静态)。

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

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

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

于 2019-08-01T22:42:21.263 回答