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


What is the difference between static functions and function outside of a class in PHP?

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

1)静态函数和普通函数有什么区别

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

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

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

(但是请参考上面注释中FuzzyTree的正确语法)

2)如何使用静态函数和普通函数(如果你简单举例就好)

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

例如,在Java中,您有Math类。它不需要实例化来使用,事实上我知道你不能,因为它的构造函数是私有的。您可以通过引用您希望使用的类和方法名 来简单地使用方法。
Math.pow(d1, d2);  //no instantiation needed
PHP中的

可能是

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

Java:何时使用静态方法

3)询问静态函数和正常函数的性能。哪个更好?

更好是你自己设计的问题。如果每次要进行数字的幂运算时都必须创建一个对象,这将比直接使用类产生更多的内存使用。我没有基准证明,但它似乎是合乎逻辑的,因为你不是在内存中以同样的方式处理方法。我不认为这在现实世界中会有什么影响,除非你做了很多复杂的动作。

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

可能也会引起您的兴趣。

我想你是在问静态方法和静态方法的区别:

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

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

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

特别是如果你用面向对象的风格编写,你应该在类定义之外的函数上使用静态方法,但我认为即使在一般情况下,使用静态方法是更好的方法。

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

一般来说,你应该知道,OOP是关于类和对象的,一个类描述并基于它的描述创建对象。

如果你告诉类包含函数"A",对象将有一个可调用函数"A",该函数可以访问对象的参数。

然而,如果你告诉类有一个静态函数,你告诉类有一个可调用的函数没有实例化对象。

困惑吗?可能一开始很难理解为什么当您开始第一个OOP步骤时需要它。静态函数是一种共享类信息的好方法,而不需要创建对象。

分析如下:以类Car和对象BMW为例。对象函数是关于宝马,静态函数是关于汽车的一般。

至于性能,根本不是性能的问题,而是设计模式的问题。因此,性能方面,如果函数是静态的或非静态的,没有什么可获得的。

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

2。现在,非静态方法的静态调用可以工作,但已弃用。所以使用正常功能。

3。从技术上讲,静态方法和变量在想要共享时非常有用类的对象之间的信息,或者想要表示的东西这与类本身有关,而不是与任何特定对象有关。出于某种原因,PHP允许调用非静态和静态方法可以互换,所以在性能方面,或者以任何你可能说的方式,使用一个普通的函数。静态对你一点帮助都没有

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

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

静态方法的性能

过去在调用静态方法时会有一个很大的惩罚——但是在5.4.0中修复了。参见http://www.micro-optimization.com/global-function-vs-static-method

从另一个家伙说的,如果它使用更多的内存一种方式比另一种绝对会导致性能差异。如果在进行GC时使用了大量内存,那么由于备份和GC,可能会导致进程排队,如果它是一个拥有数千个并发用户的企业系统,可能会导致整个系统崩溃。这可能取决于应用程序的规模。

我们永远不应该认为内存利用率的变化是"次要的"。在大系统中,这绝不是小事……