PHP父方法覆盖不起作用(使用命名空间)

时间:2018-06-07 11:18:33

标签: php inheritance methods namespaces override

每个代码部分都有三个不同的文件。 (我使用类自动加载器)。 第一个文件(/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

可能是什么问题?

Autoloader代码:

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

2 个答案:

答案 0 :(得分:0)

自动加载器中所需的文件路径将反映类名,包括命名空间 - 这需要与磁盘上的目录结构完全匹配。

spl_autoload_register的回调中,$class将首先作为 Test \ Bar 传递。这导致它试图包含文件 classes / Test / Bar.php ,这些文件并不存在。这将导致致命错误 - 听起来您的错误报告设置未配置为显示此错误。

对于您发布的文件,您的目录结构必须如下所示:

.
├── classes
│   └── Test
│       ├── Bar.php
│       └── Foo.php
├── autoloader.php
└── index.php

答案 1 :(得分:0)

解决了问题!这段代码是示例,但在实际代码中,重写方法有不同的返回类型(int而不是string)。