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

8

我需要一种从数据库中获取数据的方法,但我不理解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. 静态函数和类外函数之间的性能特性是什么?哪个更好?

3
$item = getDetail(15); 实际上会失败。也许你的意思是 $a = new Item(); $item = $a->getDetail(15) - FuzzyTree
@JayBlanchard 这个php静态函数的区别在于静态函数和非静态函数。 - Hacker Dewdie
6个回答

13

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:何时使用静态方法

3)静态函数与普通函数之间的性能如何?哪个更好?

哪个更好是根据您的设计而定。如果您每次想要计算一个数字的幂就必须创建一个对象,这将比直接使用类导致更多的内存使用。我没有基准证明,但似乎逻辑上讲是这样的,因为您在内存中没有以相同方式处理方法。除非您正在执行大量复杂的操作,否则我认为这不会在现实世界中产生影响。

静态方法与实例方法的性能

也可能会引起您的兴趣。


4

我假设您是在询问静态方法和实例方法之间的区别:

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

一个在类定义之外编写的函数:

function getDetail($arg){}

静态方法应该优先使用,而不是写在类外的函数,出于组织上的原因。在具有许多文件的应用程序中,使用 Item::getDetails($arg) 可以提示该函数定义的位置。此外,如果您开始编写许多类外部函数,则仅编写一个函数会存在名称冲突的风险。
特别是如果您正在以OOP风格编写代码,应该使用静态方法而不是类定义外部的函数,但我认为即使是一般情况下,使用静态方法也是更好的选择。

2
静态和非静态函数的区别是一个很大的问题,我们必须从面向对象编程(OOP)的角度来看待。
通常情况下,OOP是关于类和对象的,一个类描述并创建基于它的描述的对象。
如果您告诉类包含函数“A”,那么对象将具有可调用的函数“A”,该函数将访问对象参数。
但是,如果您告诉类具有静态函数,则告诉类具有可调用函数而无需实例化对象。
令人困惑?在您首次进行OOP步骤时可能会感到困难,并且难以理解为什么有时需要使用静态函数。静态函数是在不需要制作对象的情况下共享关于类的信息的好方法。
一个比喻: 取汽车类和对象宝马。 对象功能涉及 BMW,静态功能涉及一般汽车。
就性能而言,与性能无关,与设计模式有关。因此,就性能而言,函数是静态还是非静态没有任何收益。

1

1. 整个区别在于,静态函数内不会提供$this。如果你尝试使用$this,你会得到一个致命错误: 静态函数与类相关联,而不是类的实例 在第二种情况下,你会得到一个E_strict警告。

2. 现在非静态方法的静态调用已经可以工作,但已被弃用。所以请使用普通函数。

3. 严格来说,当你想要在类的对象之间共享信息或者想要表示与类本身相关而不是任何特定对象的内容时,静态方法和变量是有用的。 由于某种原因,PHP允许你交替调用非静态和静态方法,所以从性能角度或者其他方面来说,只需使用普通函数即可。静态对你没有任何帮助。


1

静态方法和非静态方法的区别在于,你可以在不实例化类的情况下访问静态方法。

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

静态方法的性能

以前调用静态方法时会有很大的惩罚,但在5.4.0中已经修复。请参见http://www.micro-optimization.com/global-function-vs-static-method


谢谢你关于静态方法性能的回答。这是我在第三个问题中想要的答案。 - Hacker Dewdie

0

根据其他人所说,如果一种方式比另一种方式使用更多的内存,那么它绝对会导致性能差异。如果你使用的内存太多以至于进入GC(垃圾回收机制),它可能会导致由于备份、GC和队列排队而引起的进程阻塞,并且可能会使整个系统崩溃,尤其是对于具有成千上万并发用户的企业系统。这可能取决于应用程序的规模。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接