嗨有没有办法检查类中的setter是否已设置?
我已经尝试过is_object和isset但没有正确的结果。
示例:
class FruitsModel{
public $fruitId;
public function setFruitId($fruitId){
$this->fruitId = $fruitId;
}
public function displayFruit()
{
if(SETTER_FRUIT IS NOT SET){throw new Exception("FruitId is missing!");}
echo $this->fruitId;
}
}
答案 0 :(得分:3)
开发人员应该知道需要在类中实现哪些方法。假设他没有,我们怎么能强迫他实施它们而不用编程方式检查其他方法中某些方法的存在?
这就是接口派上用场的地方和它们的用途。将接口视为合同,定义类必须实现哪些方法。
因此,解决任务的最简洁方法是实现一个界面。
<强> FruitsModelInterface.php 强>
<?php
interface FruitsModelInterface{
public function setFruitId($fruitId);
}
<强> FruitsModel.php 强>
<?php
class FruitsModel implements FruitsModelInterface{
protected $fruitId;
public function setFruitId($fruitId){
$this->fruitId = $fruitId;
}
public function displayFruit()
{
if(is_null($this->fruitId))
throw new FruitsModelException('Fruit ID missing!');
echo $this->fruitId;
// You'd probably better go with calling the Method
// getFruit() though and return $this->fruitId instead of echoing
// it. It's not the job ob the FruitsModel to output something
}
}
真的,这就是魔法。只需强制FruitsModelInterface通过实现适当的接口来实现setFruitId()
方法。在displayFruit()
中,您只需检查属性是否确实已分配。
我还保护您的财产,以便您可以确定该值只能在班级或其子女中设置。
快乐的编码!
进一步阅读
答案 1 :(得分:2)
你应该做的是将$ fruitId初始化为默认值为null,然后你可以说:if($this->fruitId === null){}
顺便说一下,让你的属性变得私有,你不希望有一个带有公共变量的setter:)
答案 2 :(得分:0)
您可以尝试使用method_exits()
。检查一个类中是否存在方法。
类似的东西:
$directory = new Directory('.');
var_dump(method_exists($directory,'read')); //method_exists return a bool
有关更多文档,请查看此链接:http://www.php.net/method_exists
答案 3 :(得分:0)
你可以在课堂上创造一个功能。
class FruitsModel {
public function variableExists($key) {
$retVal = false;
if(isset($this->$key) == true) {
$retVal = true;
}
return $retVal;
}
}
用法:
$fm = new FruidsModel();
echo $fm->variableExists($fruitId); //true
答案 4 :(得分:0)
为变量的值创建一个新方法,如果你想让另一个类无法访问它,这可以是私有的:
class FruitsModel{
public $fruitId = "";
public function setFruitId($fruitId){
$this->fruitId = $fruitId;
}
private function getFruitId(){
return $this->$fruitId;
}
public function displayFruit()
{
if($this->getFruitId() == ""){throw new Exception("FruitId is missing!");}
echo $this->fruitId;
}
}