Содержит классы внутри файла в PHP - PullRequest
0 голосов
/ 27 января 2019

Предположим, у меня есть простой файл PHP, например, так:

FooBar.php

class Foo { // Helper class for FooBar
  function toString() {
    echo "Foo!<br>"
  }
}

class FooBar {
  public $foo;
  function __construct() {
    $this->foo = new Foo();
  }
}

Теперь предположим, что я хотел бы использовать FooBar.php в отдельном файле (в том же каталоге для этого примера), , но Я также хочу разрешить другому классу называться 'Foo'.

index.php

include("FooBar.php");

class Foo { // a new Foo object
  function toString() {
    echo "Foo #2!<br>";
  }
}

$foobar = new FooBar();

// Let's say I call 'toString()' ...
$foobar->foo->toString();
  • Мой Ожидаемый Результат: "Foo!"
  • Мой желаемый результат: "Foo#2!"
  • Мой Фактический Результат: Cannot declare class Foo, because the name is already in use in ...

Можно ли ограничить класс Foo в FooBar.php, чтобы другой класс мог снова использовать это имя? Я подозреваю, что решение будет связано с пространствами имен , хотя проведенное мной исследование показывает, что это полезно только для файлов в разных каталогах. Спасибо в avance!

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Пространства имен PHP do not требуют, чтобы вы помещали файлы в разные каталоги, даже если их синтаксис несколько напоминает путь к файловой системе.Например, это прекрасно работает:

FooBar.php:

<?php
namespace MyNamespace;

class Foo { // Helper class for FooBar
  function toString() {
    return "Foo!";
  }
}

class FooBar {
  public $foo;
  function __construct() {
    $this->foo = new Foo();
  }
}

index.php :

<?php
include("FooBar.php");
use MyNamespace\FooBar;

class Foo { // a new Foo object
  function toString() {
    return "Foo #2!";
  }
}

$foobar = new FooBar();
$foo = new Foo();

echo $foobar->foo->toString(), "\n";
echo $foo->toString(), "\n";

При наличии обоих файлов в текущем каталоге, приведенных выше, при запуске php index.php в командной строке будет напечатано:

Foo!
Foo #2!

Однако вы, вероятно, должны следовать рекомендациям по стандартам PHP, в частности PSR-1 и PSR-4 , которые, помимо прочего, требуют, чтобы каждый класс находился в отдельном файле, имя которого совпадает с именем класса (плюс.php суффикс) и принадлежать пространству имен, которое каким-то образом соответствует пути его файловой системы (хотя PSR-4 допускает некоторые различия в способе имен пространства имен сопоставляться с путями файловой системы).

Если бы вы следовали этим рекомендациям, вы не столкнулись бы с этой проблемой с самого начала , так как два ваших Foo класса естественно принадлежали бы разным пространствам имен и, следовательно, не конфликтовали бы.

0 голосов
/ 27 января 2019

Вы не можете перерабатывать имена классов, но вы можете переопределить определения классов, расширяя и переопределяя методы и свойства, которые являются открытыми или защищенными.

Используя пространства имен, вы в основном просто расширяете имя класса, так чтоизменяя часть пространства имен, вы гарантируете, что имя класса останется уникальным.

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