我需要有从数据库中获取内容的方法,但我不了解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);
- 他们就会一样。
答案 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导致进程排队,可能导致整个系统崩溃,如果它是一个拥有数千个的企业系统并发用户。它可能取决于应用程序的规模。
我们永远不应该认为内存利用率的变化是次要的"。它在大型系统中从不轻微......