PHP: Статический метод в классе против глобальной функции в пространстве имен?

В чем разница между созданием глобальной функции в пространстве имен (и вызовом ее из глобального пространства имен):

<?php
namespace MyNamespace  {
function MyFunction($x, $y)  {
return $x + $y;
}
}

namespace {  //global code... in a new file
var_dump(MyNamespace\MyFunction(1,2));
}

и создание статического метода класса, и вызов из глобального пространства имен ?:

<?php
class MyClass  {
public static function MyFunction($x, $y)  {
return $x + $y;
}
}

var_dump(MyClass::MyFunction(1,2));

Есть ли причина предпочитать один метод другому?

3

Решение

Есть ли причина предпочитать один метод другому?

(ниже предполагается, что вы спрашиваете / имеете в виду разницу между методом статического класса и функцией в пространстве имен)

Исторически (до появления пространств имен) люди были вынуждены использовать классы со статическими функциями, чтобы не загрязнять глобальное пространство имен. Это одна из причин, по которой вам чаще всего приходится сталкиваться с этим методом.

Вы можете предпочесть использовать статический метод, если вам нужен доступ к данным класса или если вы думаете о том, чтобы оставить возможность переопределить их в классах-потомках (так называемая «гибкость и функциональность» некоторыми).

Вы можете предпочесть функцию с пространством имен, когда все, что вам нужно, это … хм … функция. Подумайте о некоторых утилитарных, функциональных или коллекционных функциях, таких как compose / part повторить попытку , фильтр / карта / некоторые / каждый и т. д. Вы, вероятно, не ожидаете, что это будет перезаписано в дочернем классе, верно? Также ему не нужен доступ к некоторому статическому члену класса.

Однако существует одна особая раздражающая проблема с функциями (пространством имен), от которой классы не страдают. И это автозагрузка. Короче говоря, есть нет способа загрузить функцию в данный момент. И это еще одна причина, по которой вы, скорее всего, будете чаще сталкиваться с классами со статическими методами (когда они не обязательно должны быть) на практике.

4

Другие решения

Основное отличие заключается в том, что глобальное пространство имен может иметь только один названная функция 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», а также эффективно в конкретных реализациях mail, и держать общее send() API мы узнали и любим.

Есть ли причина предпочитать один метод другому?

Либо будет работать. Вы просто получаете больше функциональности и гибкости при работе с классами.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector