首页 > 解决方案 > 为类使用命名空间

问题描述

我试图运行这段代码:

$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() 必须返回字符串值

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

提前谢谢你们!

标签: phpclassnamespaces

解决方案


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

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

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

推荐阅读