PHP中类的静态函数和函数有什么区别?

时间:2014-05-28 21:11:20

标签: php oop

我需要有从数据库中获取内容的方法,但我不了解PHP中静态函数和普通函数之间的区别。

示例代码

class Item {
    public static function getDetail($arg) {
        $detail = $this->findProductId($arg);   
        return $detail;
    }

    private function findProductId($id) {
        //find product_id in database where id = $arg
        //return detail of product
    }
}

和类外的函数

function getDetail($arg) {
    $detail = findProductId($arg);
    return $detail;
}

如果我使用$item = Item::getDetail(15);$item = getDetail(15); - 他们就会一样。

  1. 类之外的静态和函数有什么区别?
  2. 如果它们不同,如​​何在课堂外使用静态功能和功能? (我很欣赏一个非常简单的例子。)
  3. 类之外的静态和函数之间的性能属性是什么?哪个更好?

6 个答案:

答案 0 :(得分:10)

1)静态功能和正常功能有什么区别

虽然它们是函数,但我更喜欢将它们称为给定类的方法。一个是静态方法,另一个是实例方法。

静态方法:$item = Item::getDetail(15);

实例方法:$item = getDetail(15);

(请参阅上面评论中的FuzzyTree的正确语法。)

2)如何使用静态函数和正常函数(如果你简单的例子是好的)

静态意味着您不必实例化(声明对象引用)。也就是说,您可以简单地使用该方法。因此,在您的示例中,虽然答案可能相同,但您调用该方法/函数的方式也不同,如上所述。

例如,在Java中,您拥有Math类。它不需要实例化使用,事实上你不能我所知道的,因为它的构造函数是私有的。您只需通过引用要使用的类和方法名称来使用方法,

Math.pow(d1, d2);  //no instantiation needed
这可能是PHP中的

MyClass::pow(d1,d2); //no instantiation needed

Java: when to use static methods

3)询问静态功能和正常功能之间的性能。哪个更好?

更好的是你的设计问题。如果你每次想要使用一个数字的力量来创建一个对象,那么就会产生更多的内存,而不是直接使用该类。我没有基准证明,但它似乎合乎逻辑,因为你没有在内存中以相同的方式处理方法。除非你做了很多复杂的动作,否则我认为它在现实世界中并不重要。

Performance of static methods vs instance methods

也许你会感兴趣。

答案 1 :(得分:2)

我假设您正在询问静态方法之间的区别:

class Item {
    public static function getDetail($arg){}
}

在类定义之外写的函数:

function getDetail($arg){}

出于组织原因,静态方法应该用于在类外部编写的函数。在具有许多文件的应用程序中,使用Item::getDetails($arg)将提示该函数的定义位置。此外,如果您开始在类之外编写许多函数,那么只有在类外部编写的函数会冒名称冲突的风险。

特别是如果您使用OOP样式编写,您应该使用静态方法而不是类定义之外的函数,但我认为即使一般情况下使用静态方法也是更好的方法。

答案 2 :(得分:1)

1.完全不同的是,你不会在静态函数中获得$ this。如果您尝试使用$ this,则会收到致命错误: 静态函数与类关联,而不是类的实例 在第二种情况下,您将收到E_strict警告。

2.现在静态调用非静态方法有效但不推荐使用。所以使用正常功能。

3.从技术上讲,静态方法和变量在您想要共享时非常有用 类的对象之间的信息,或者想表示某些东西 这与班级本身有关,而与任何特定对象无关。 出于某种原因,PHP允许您调用非静态和静态方法 可互换,所以表现明智或以任何方式你可以说只是使用正常的功能。静态不会帮助你

答案 3 :(得分:1)

静态和非静态之间的区别在于,您可以在没有类实例的情况下访问静态方法。

$item = getDetail(15);不应该起作用,因为detDetail是类中的方法而不是函数。

静态方法的表现

在调用静态方法时曾经有过一个很大的惩罚 - 但它已在5.4.0中修复。见http://www.micro-optimization.com/global-function-vs-static-method

答案 4 :(得分:1)

静态和非静态函数的区别是一个很大的答案,我们必须看一般的面向对象编程(OOP)。

正如您所知,OOP通常是关于类和对象,类根据它的描述来描述和创建对象。

如果你告诉班级包含这个功能" A"该对象将具有可调用的功能" A"谁有权访问对象参数。

但是,如果您告诉该类具有静态函数,则告诉该类具有可调用函数而不实例化对象。

混淆?可以在最初时很难理解为什么在你采取第一个OOP步骤时有时需要它。静态函数是一种分享有关类的信息而不需要创建对象的好方法。

分析将是: 乘坐Car级车和宝马车。 对象功能是关于 THE 宝马,静态功能一般是关于汽车。

在性能方面,它根本不是关于性能,而是关于设计模式。因此,如果函数是静态的或非静态的,那么在性能方面没有任何好处。

答案 5 :(得分:0)

从另一个人的说法来看,如果它使用更多内存而不是另一个,那么绝对会导致性能差异。如果您使用如此多的内存进入GC,由于gc导致进程排队,可能导致整个系统崩溃,如果它是一个拥有数千个的企业系统并发用户。它可能取决于应用程序的规模。

我们永远不应该认为内存利用率的变化是次要的"。它在大型系统中从不轻微......