Переопределение родительского метода PHP не работает (с использованием пространств имен) - PullRequest
0 голосов
/ 07 июня 2018

У меня есть три разных файла для каждой части кода.(я использую автозагрузчик классов).Первый файл (/classes/Test/Foo.php):

<?php
namespace Test;

class Foo
{
  public $id;

  function __construct(int $id)
  {
    $this->id = $id;
  }

  public function get() : string
  {
    return "FOO:" . $this->id;
  }
}

Второй файл (/classes/Test/Bar.php):

<?php
namespace Test;

class Bar extends Foo
{
  public function get() : string
  {
    return "BAR:" . $this->id;
  } 
}

Третий файл (/ index.php):

<?php
namespace Test;
include "autoloader.php";
$bar = new Bar(1);
echo $bar->get();

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

<?php
namespace Test;

class Foo
{
  public $id;

  function __construct(int $id)
  {
    $this->id = $id;
  }

  public function get() : string
  {
    return "FOO:" . $this->id;
  }
}

class Bar extends Foo
{
  public function get() : string
  {
    return "BAR:" . $this->id;
  } 
}

$bar = new Bar(1);
echo $bar->get();

вывод: BAR: 1

В чем может быть проблема?

Код автозагрузчика:

<?php
spl_autoload_register(function($class) {
  require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/" . str_replace("\\", "/", $class) . ".php";
});

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Решил проблему!Этот код был примером, но в реальном коде переопределенный метод имел другой тип возврата (int вместо строки).

0 голосов
/ 07 июня 2018

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

В обратном вызове spl_autoload_register, *Сначала 1006 * будет передано как Test \ Bar .В результате он пытается включить файл classes / Test / Bar.php , который не существует.Это приведет к фатальной ошибке - похоже, ваши настройки отчетов об ошибках не настроены для отображения этого.

Для файлов, которые вы разместили, ваша структура каталогов должна выглядеть следующим образом:

.
├── classes
│   └── Test
│       ├── Bar.php
│       └── Foo.php
├── autoloader.php
└── index.php
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...