【问题标题】:PHP: Static and non Static functions and ObjectsPHP:静态和非静态函数和对象
【发布时间】:2011-05-20 16:22:38
【问题描述】:

这些对象调用有什么区别?

非静态:

$var = new Object;
$var->function();

静态:

$var = User::function();

还有在class 中,为什么我应该使用静态属性来实现函数?

示例:

static public function doSomething(){
    ...code...
}

【问题讨论】:

  • @mario。有点苛刻。也许 cirk 确实阅读了手册并且没有完全掌握这个概念。向其他程序员征求意见似乎很公平。
  • @Ben。也许太苛刻了。但我不想在没有评论或只是 RTFM 链接的情况下投反对票。我的猜测是他确实在某个地方读到过它,但在这里征求了“第二意见”。要是他这么说就好了。

标签: php static


【解决方案1】:

关于 STATIC 函数的问题不断出现。

根据定义,静态函数不能也不依赖于类的任何实例属性。也就是说,它们不需要类的实例来执行(因此可以执行。 在某种意义上,这意味着函数不(也永远不需要)依赖于类的成员或方法(公共或私有)。

class Example {

    // property declaration
    public $value = "The text in the property";

    // method declaration
    public function displayValue() {
        echo $this->value;
    }

    static function displayText() {
        echo "The text from the static function";
    }
}


$instance = new Example();
$instance->displayValue();

$instance->displayText();

// Example::displayValue();         // Direct call to a non static function not allowed

Example::displayText();

【讨论】:

  • 欣赏这个答案。 :)
【解决方案2】:

区别在于变量范围。想象一下你有:

class Student{
    public $age;
    static $generation = 2006;

   public function readPublic(){
       return $this->age;  
   }

   public static function readStatic(){
       return $this->age;         // case 1
       return $student1->age;    // case 2 
       return self::$generation;    // case 3 

   }
}

$student1 = new Student();
Student::readStatic();
  1. 您的静态函数无法知道 $this 是什么,因为它是静态的。如果可能有 $this,它应该属于 $student1 而不是 Student。

  2. 它也不知道 $student1 是什么。

  3. 它确实适用于案例 3,因为它是属于类的静态变量,与前面的 2 不同,它属于必须实例化的对象。

【讨论】:

    【解决方案3】:

    静态函数或字段不依赖于初始化;因此,是静态的。

    【讨论】:

      【解决方案4】:

      根据定义,静态函数不能也不依赖于类的任何实例属性。也就是说,它们不需要类的实例来执行(因此可以按照您所展示的那样执行,而无需先创建实例)。在某种意义上,这意味着函数不(也永远不需要)依赖于类的成员或方法(公共或私有)。

      【讨论】:

      • 将静态函数放在类中而不是放在单独的functions.php文件中有什么意义?
      • @billmalarky 这不是必需的,但它至少可以帮助您将函数组织到相关的文件中。对我来说,拥有像User::someFunction(); 这样的函数比Function::someUserFunction; 更容易也更合乎逻辑,而且肯定比someFunction(); 更好
      【解决方案5】:

      静态方法和成员属于类本身,而不属于类的实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-28
        • 2014-04-27
        相关资源
        最近更新 更多