【问题标题】:Using namespace for classes为类使用命名空间
【发布时间】:2020-05-04 14:50:37
【问题描述】:

我正在尝试运行此代码:

$spaceMarine = new \ Imperium \ Soldier (" Gessart ");
$chaosSpaceMarine = new \ Chaos \ Soldier (" Ruphen ");
echo $spaceMarine . "\n";
echo $chaosSpaceMarine . "\n";
$spaceMarine -> doDamage ( $chaosSpaceMarine );
echo $spaceMarine . "\n";
echo $chaosSpaceMarine . "\n";
// Has to display :
Gessart the Imperium Space Marine : 50 HP.
Ruphen the Chaos Space Marine : 70 HP.
Gessart the Imperium Space Marine : 50 HP.
Ruphen the Chaos Space Marine : 58 HP.

我想知道使用命名空间是否绝对需要我在不同的文件中创建 2 个士兵类?因为我在同一个页面中完成了所有操作:

namespace Imperium;



class Soldier
{
private $_hp;
private $_attack;
private $_name;


function __construct($name, $hp = 50, $attack = 12)
{
    $this->_name = $name;
    $this->_hp = $hp;
    $this->_attack = $attack;
}
public function getHP()
{
    return $this->_hp;
}

public function setHP($hp)
{
    $this->_hp = $hp;
}

public function getAttack()
{
    return $this->_attack;
}
public function setAttack($attack)
{
    $this->_attack = $attack;
}

public function doDamage($obj)
{

    $obj = $this->_hp - $this->_attack;
}
public function __toString()
{
    echo "$this->_name the Imperium Space Marine : $this->_hp";
}
}


namespace Chaos;

class Soldier
{

function __construct($name, $hp = 70, $attack = 12)
{
    $this->_name = $name;
    $this->_hp = $hp;
    $this->_attack = $attack;
}

public function getHP()
{
    return $this->_hp;
}

public function setHP($hp)
{
    $this->_hp = $hp;
}

public function getAttack()
{
    return $this->_attack;
}
public function setAttack($attack)
{
    $this->_attack = $attack;
}

public function doDamage($obj)
{

    $obj = $this->_hp - $this->_attack;
}

public function __toString()
{
    echo "$this->_name __NAMESPACE__ Space Marine : $this->_hp";
}
}

use Imperium;
use Chaos;

$spaceMarine = new \Imperium\Soldier ("Gessart");
$chaosSpaceMarine = new \Chaos\Soldier ("Ruphen");
echo $spaceMarine . "\n";
echo $chaosSpaceMarine . "\n";
$spaceMarine -> doDamage ( $chaosSpaceMarine );
echo $spaceMarine . "\n";
echo $chaosSpaceMarine . "\n";

有没有办法在同一页面中完成所有操作?下面的代码不起作用它说:

可捕获的致命错误:方法 Imperium\Soldier::__toString() 必须 返回一个字符串值

我不确定完全理解命名空间..

提前谢谢大家!

【问题讨论】:

  • 该错误与命名空间无关。 __toString 必须返回字符串,而不是打印它。
  • 你可能想看看继承,看起来你正在构建两个全新的类,每个命名空间中都有一个 - 我会认为这些是非常相似的类,也许应该有一个基类称为士兵,每个人都会扩展它并添加自己的详细信息。
  • 是的,我知道你的意思,但我已经知道继承是如何工作的,我只是想更熟悉命名空间的方式
  • 最后一次编辑把你的帖子搞砸了:)
  • @zeea 如果代码是机密练习,那么解决方案是不要在此处发布。解决方案不是提出问题,获得答案,然后对其进行编辑以删除代码。这是在浪费其他人的时间和精力。

标签: php class namespaces


【解决方案1】:

命名空间不要求您在不同的文件中定义类。但是,你应该。这被认为是一种最佳做法,如果这样做,您可以使用 PSR-4 自动加载。

关于错误,这是一个简单的修复 - 只需 return 字符串而不是回显它:

public function __toString()
{
    return "$this->_name the Imperium Space Marine : $this->_hp";
}

【讨论】:

  • 谢谢!现在我收到了这个错误:致命错误:无法声明类 Chaos\Soldier,因为该名称已在 'dir..' 中使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
  • 2011-09-10
相关资源
最近更新 更多