PHP:Class 中的静态方法与命名空间中的全局函数?
PHP: Static method in Class vs Global function in Namespace?
在命名空间中创建全局函数(和从全局命名空间调用它)有什么区别:
<?php
namespace MyNamespace {
function MyFunction($x, $y) {
return $x + $y;
}
}
namespace { //global code... in a new file
var_dump(MyNamespace\MyFunction(1,2));
}
并创建静态 class 方法,并从全局命名空间调用?:
<?php
class MyClass {
public static function MyFunction($x, $y) {
return $x + $y;
}
}
var_dump(MyClass::MyFunction(1,2));
有什么理由比另一种更喜欢一种方法吗?
主要区别在于全局命名空间只能有 一个 函数命名为 MyFunction
。
使用命名空间,每个命名空间都可以拥有自己的 MyFunction
副本。这使您可以灵活地创建一个通用的 API,而不必想出聪明的名字。
例如:
namespace Mail {
public static function send() {
// Send Mail
}
}
namespace SMS {
public static function send() {
// Send Text Message
}
}
单个全局命名空间不可能做到这一点。但现在您有一个可预测的接口来调用 Mail\send()
或 SMS\send()
.
对于 类,创建这些契约的能力比命名空间中的函数要好得多,因为您可以获得构建接口和使用抽象的能力。
例如:
abstract class Mail {
public static function send() {
// Create empty implementation (have to do this because it is static)
};
}
class MailChimp extends Mail {
public static function send() {
// Send Mail
}
}
class MailGun extends Mail {
public static function send() {
// Send Mail
}
}
有了它,我们现在可以在 "Mail" 下命名事物,而且在邮件的特定实现下也有效,并且 keep 通用 send()
API 我们已经相知相爱。
Is there any reason to prefer one method over the other?
两者都行。在处理 类.
时,您只会获得更多的功能和灵活性
Is there any reason to prefer one method over the other?
(下面假设您 asking/referring 了解静态 class 方法和命名空间中的函数之间的区别)
历史上(在命名空间出现之前),人们被迫将 classes 与静态函数一起使用,以免污染全局命名空间。这是您可能更频繁地遇到此方法的原因之一。
如果您需要访问 class 的数据,或者如果您想要在后代 classes 中覆盖它们(so-called 'flexibility and functionality' 一些)。
当您想要的只是...呃,咳咳...函数时,您可能更喜欢命名空间函数。想想一些 util、函数或集合函数,例如 compose/partial、retry、filter/map/some/every 等。您可能不希望它在 child class 中被覆盖, 正确的?它也不需要访问某些静态 class 成员。
虽然(命名空间)函数有一个特别烦人的问题,但 classes 不会遇到。它是自动加载的。简而言之,目前有no way to autoload a function。这是另一个原因,您可能会在实践中更频繁地遇到 class 静态方法(当它们不一定需要时)。
在命名空间中创建全局函数(和从全局命名空间调用它)有什么区别:
<?php
namespace MyNamespace {
function MyFunction($x, $y) {
return $x + $y;
}
}
namespace { //global code... in a new file
var_dump(MyNamespace\MyFunction(1,2));
}
并创建静态 class 方法,并从全局命名空间调用?:
<?php
class MyClass {
public static function MyFunction($x, $y) {
return $x + $y;
}
}
var_dump(MyClass::MyFunction(1,2));
有什么理由比另一种更喜欢一种方法吗?
主要区别在于全局命名空间只能有 一个 函数命名为 MyFunction
。
使用命名空间,每个命名空间都可以拥有自己的 MyFunction
副本。这使您可以灵活地创建一个通用的 API,而不必想出聪明的名字。
例如:
namespace Mail {
public static function send() {
// Send Mail
}
}
namespace SMS {
public static function send() {
// Send Text Message
}
}
单个全局命名空间不可能做到这一点。但现在您有一个可预测的接口来调用 Mail\send()
或 SMS\send()
.
对于 类,创建这些契约的能力比命名空间中的函数要好得多,因为您可以获得构建接口和使用抽象的能力。
例如:
abstract class Mail {
public static function send() {
// Create empty implementation (have to do this because it is static)
};
}
class MailChimp extends Mail {
public static function send() {
// Send Mail
}
}
class MailGun extends Mail {
public static function send() {
// Send Mail
}
}
有了它,我们现在可以在 "Mail" 下命名事物,而且在邮件的特定实现下也有效,并且 keep 通用 send()
API 我们已经相知相爱。
Is there any reason to prefer one method over the other?
两者都行。在处理 类.
时,您只会获得更多的功能和灵活性Is there any reason to prefer one method over the other?
(下面假设您 asking/referring 了解静态 class 方法和命名空间中的函数之间的区别)
历史上(在命名空间出现之前),人们被迫将 classes 与静态函数一起使用,以免污染全局命名空间。这是您可能更频繁地遇到此方法的原因之一。
如果您需要访问 class 的数据,或者如果您想要在后代 classes 中覆盖它们(so-called 'flexibility and functionality' 一些)。
当您想要的只是...呃,咳咳...函数时,您可能更喜欢命名空间函数。想想一些 util、函数或集合函数,例如 compose/partial、retry、filter/map/some/every 等。您可能不希望它在 child class 中被覆盖, 正确的?它也不需要访问某些静态 class 成员。
虽然(命名空间)函数有一个特别烦人的问题,但 classes 不会遇到。它是自动加载的。简而言之,目前有no way to autoload a function。这是另一个原因,您可能会在实践中更频繁地遇到 class 静态方法(当它们不一定需要时)。