Преимущества пространства имен PHP - PullRequest
5 голосов
/ 24 февраля 2012

После некоторого исследования пространства имен в PHP, я пытаюсь выяснить, каковы же реальные преимущества, кроме группировки элементов библиотеки и повторного использования одного и того же имени класса.

Что мне не нравится в пространствах имен, так это дополнительные строки в верхней части файла, который вы называете классами из 'use core \ what \ class', что вам не нужно делать со стандартным подходом.

Кроме того - что-то, о чем я не смог найти информацию - что происходит в ситуации, когда нам нужно использовать два класса с одинаковым именем, но в разных папках, которые содержат одно и то же имя метода? Нам все равно придется вызывать пространство имен, но как код определит, какой метод из какого класса следует использовать?

Я только начал с пространств имен, так что извините, если этот вопрос кажется очень простым.

Кроме того - как это работает со статическими методами - например, с классом Helper - нужно ли мне также указывать, что мне нужно это пространство имен 'use core \ what \ Helper'?

Ответы [ 3 ]

12 голосов
/ 24 февраля 2012

Если у вас большой проект с множеством классов, вы в конечном итоге столкнетесь с конфликтами имен.У вас есть db/mysql/adapter.php и http/curl/adapter.php.Чтобы справиться с этим без пространств имен, вы должны дать своим классам уникальные имена, такие как Db_Mysql_Adapter и Http_Curl_Adapter, и каждый раз, когда вы обращаетесь к этим классам, вы должны использовать их полное имя.

Пространства имен позволяют вамНазовите ваши классы Db\Mysql\Adapter и Http\Curl\Adapter и просто обратитесь к ним по Adapter в их локальном пространстве имен или Mysql\Adapter и Curl\Adapter соответственно в других пространствах имен.Это может сэкономить много набора текста.

Просто просмотрите исходный код Zend Framework версия 1 против версия 2 , чтобы увидеть разницу.

что происходит в ситуации, когда нам нужно использовать два класса с одинаковым именем, но в разных папках, которые содержат одинаковое имя метода?Нам все равно придется вызывать пространство имен, но как код определит, какой метод из какого класса следует использовать?

Если вы находитесь в пространстве имен Db\Mysql, Adapter::foo() относится к Db\Mysql\Adapter и \Http\Curl\Adapter::foo() относятся к другому.Вы также можете создать псевдоним класса в верхней части вашего файла, если вы не хотите постоянно писать полное имя:

namespace Db\Mysql;
use Http\Curl\Adapter as HAdapter;

Adapter::foo();  // Mysql adapter
HAdapter::foo(); // Http adapter, same as:
\Http\Curl\Adapter::foo();
1 голос
/ 24 февраля 2012

Что мне не нравится в пространствах имен, так это дополнительные строки в верхней части файла, который вы называете классами из 'use core \ what \ class', что вам не нужно делать со стандартным подходом.

Пространства имен логически группируют классы и избегают загрязнения глобальной области. Это также не позволяет вам создавать большой кусок кода PHP, который может содержать части, необходимые в других местах на вашем сайте. Это дает больше оснований для размещения его в другом файле для использования другой частью сайта. Не повторяйте себя (СУХОЙ), используйте во многих местах, но используйте только один раз!

что происходит в ситуации, когда нам нужно использовать два класса с одинаковым именем, но в разных папках, которые содержат одно и то же имя метода? Нам все равно придется вызывать пространство имен, но как код определит, какой метод из какого класса следует использовать?

Пространство имен предотвращает эти проблемы, используя aliases . кроме того, иметь классы с тем же именем? если они не имеют одно и то же имя, но различного назначения или другой подкатегории, например api.document.events и api.ajax.events. В противном случае, это плохой дизайн программы.

0 голосов
/ 10 ноября 2017

Этот ответ сфокусирован на ответе @deceze.

Его аргумент в том, что иметь два класса с разными именами сложнее.Это так?

1.) Его пример кода не работает, потому что он никогда не включал файлы.Так что это должно выглядеть так:

namespace Db\Mysql;
use Http\Curl\Adapter as HAdapter;

include('Db/Mysql/Adapter.php');
include('Http/Curl/Adapter.php');   

Adapter::foo();  // Mysql adapter
HAdapter::foo(); // Http adapter, same as:
\Http\Curl\Adapter::foo();

2.) Вы не можете включать файлы adapter.php, если вы не добавляете определение пространства имен в эти файлы:

<?php
// this is Db/Mysql/Adapter.php

namespace Db/Mysql;

class Adapter {
  static function foo() {
  }
}

?>

А теперь вариант без пространства имен:

include('db/mysql/adapter.php');
include('http/curl/adapter.php');

MysqlAdapter::foo(); // Mysql adapter
CurlAdapter::foo(); // Http adapter

A adapter.php должен выглядеть следующим образом:

<?php
// this is Db/Mysql/Adapter.php

class MysqlAdapter {
  static function foo() {
  }
}

?>

Наконец вам нужно отредактировать столько же файлов, сколько и раньше, добавив большекод, как и раньше.Так что это не может быть аргументом.

Единственный аргумент, который может существовать, это то, что вы избегаете проблем с конфликтующими сторонними библиотеками .Но сколько конфликтов имен у вас было в прошлом?А сколько библиотек вы знаете, которые используют пространства имен, чтобы вам не нужно было редактировать все файлы?

Дело в том, что в реальном мире нет никакой пользы.Это что-то перенятое из мира Си, которое, на мой взгляд, добавляет больше запутанности, чем пользы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...