2

我有 TestClass 和一个公共方法。我可以使用 :: 运算符(如静态方法)和使用对象来调用相同的方法。如果我们能够在不创建同一个类的对象的情况下调用公共函数,那么 PHP 中静态函数的优点或用途是什么?

<?php

class TestClass { 
    public function testMethod() { 
      echo 'Method called';
    }
}

TestClass::testMethod();

$classObj = new TestClass(); 
$classObj->testMethod();

?>
4

4 回答 4

6

在这种情况下,没有区别。

但是,static函数的意义在于,某些函数不需要类的实例即可执行。即使函数未标记为静态,也可以静态调用函数,但这样做在技术上是不正确的。如果你已经error_reporting(E_ALL)设置,它会给你一个严格的标准错误。

这不是因为代码不起作用,而是因为它可能不起作用。

class TestClass {
    private $name = 'Rakesh';
    public function doSomething() {
        echo "Hi there";
    }
    public function doSomethingElse() {
        echo "Hi there " . $this->name;
    }
}

您可以静态调用第一个函数,它会正常工作。但是如果你doSomethingElse静态调用,它就不起作用,因为它会尝试访问$this,这只有在你有一个对象的情况下才有可能。

所以我们应用static关键字来doSomething让 (a) PHP 和 (b) 使用该类的程序员知道可以静态调用它。这是一个承诺,它将起作用。

假设应该是,如果它未标记为static,则不应静态调用它。

PHP 的严格标准错误旨在使您的代码更好,即使它已经可以工作。常量E_STRICT文档说:

启用让 PHP 建议对您的代码进行更改,这将确保您的代码的最佳互操作性和前向兼容性。

于 2013-11-08T10:55:34.810 回答
4

在底层术语中,PHP 中的静态函数与成员函数没有太大区别。唯一真正的区别是$this没有提供给静态函数。

这意味着static关键字的使用主要是语义上的好处,因为它可以帮助您定义类的体系结构和预期行为。

话虽如此,您不应该滥用语义。PHP 可以(可选地)警告您这些类型的错误,您应该始终注意此类警告。语言规范的存在是有原因的,它旨在以某些方式工作。如果您static不正确地使用(或任何其他语言功能),那么它可能不会总是按您预期的那样工作。未来的 PHP 更新或配置更改可能会意外破坏您的代码。

于 2013-11-08T11:00:32.340 回答
1

将类属性或方法声明为静态使它们无需实例化即可访问。声明为静态的属性不能用实例化的类对象访问(尽管静态方法可以)。

为了与 PHP 4 兼容,如果没有使用可见性声明,则属性或方法将被视为已声明为 public。优点是...

1>不会创建哈希内存,因此不会浪费内存(没有内存泄漏问题)

2>

// This makes little sense
Math m = new Math();
int answer = m.sin(45);

// This would make more sense
int answer = Math.sin(45);
于 2013-11-08T11:02:33.693 回答
0

它就像一个捷径,多了一个 php 的特性。但是,要访问它们的属性,您必须将它们声明为常量。例如:

<?php
class Math{
       const pi=3.1416; 
}
echo Math::pi;
?>
于 2013-11-08T11:11:44.453 回答