php - 为类使用命名空间
问题描述
我试图运行这段代码:
$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() 必须返回字符串值
我不确定完全理解命名空间..
提前谢谢你们!
解决方案
命名空间不需要您在不同的文件中定义类。但是,你应该。这被认为是最佳实践,如果这样做,您可以使用PSR-4自动加载。
关于错误,这是一个简单的修复——只是return
字符串而不是回显它:
public function __toString()
{
return "$this->_name the Imperium Space Marine : $this->_hp";
}
推荐阅读
- node.js - 无服务器部署到 AWS Lambda 缺少模块?
- sql - 从多个表上的选择更新
- c# - ViewModel 函数有一些无效参数
- git - Git LFS 迁移失败并显示“无法更新参考:退出状态 129”
- powershell - 这应该是 else if 语句吗?
- typescript - Ionic 5 虚拟滚动创建空白空间而不是新项目
- c# - 从模型变量填充 asp 页面
- android - ConstraintLayout(似乎)在 RecyclerView 上使用大量内存(最多 1GB),具体取决于列表中的项目数量
- sql - 固定列上的 SQL Pivot
- bash - 如何重新定位每行的第二个字符串以从同一行的第 n 个字符开始