Php 如何检查是否设置了所有声明的变量?
我对PHP中的整个OOP范例相当陌生,但到目前为止我真的很喜欢它。我目前正在编写一个EventSender类,它应该收集一些信息,然后将事件激发到EventHandler,并将事件写入eventlog 当我谈到“触发”部分时,我突然想到,我真的希望有一个简单的解决方案来验证我所有声明的变量是否都已设置。有没有一种简单的方法可以做到这一点,或者甚至是PHP中的内置函数 此外,下面粘贴的代码是目前为止我的类的实际代码,因此,如果您有任何其他意见,请随时阐述您的想法:-) 致以最良好的祝愿,Php 如何检查是否设置了所有声明的变量?,php,class,oop,validation,object,Php,Class,Oop,Validation,Object,我对PHP中的整个OOP范例相当陌生,但到目前为止我真的很喜欢它。我目前正在编写一个EventSender类,它应该收集一些信息,然后将事件激发到EventHandler,并将事件写入eventlog 当我谈到“触发”部分时,我突然想到,我真的希望有一个简单的解决方案来验证我所有声明的变量是否都已设置。有没有一种简单的方法可以做到这一点,或者甚至是PHP中的内置函数 此外,下面粘贴的代码是目前为止我的类的实际代码,因此,如果您有任何其他意见,请随时阐述您的想法:-) 致以最良好的祝愿, Andr
AndréV.使用
反射
可以列出类的属性
但我认为这太过分了…为了理智起见,在调用
fire()
之前,请明确定义控制实例状态的规则,并将其移动到单独的函数。所以你的fire()
就变成了
function fire() {
if ($this->validate_state()) {
/// do whatever
...
} else {
/// report issues
}
}
您的验证器只需检查需要到位的所有内容,即
function validate_state() {
if ( isset($this->some_property) )
....
}
或者,如果您的状态检查只是想确保设置了默认值,请确保在
\u构造中执行此操作。通过这种方式,您可以知道哪些值应该被合理地定义。基于Lajos Veres的回答,我成功地构建了一个可以添加到特征中的类(我在本例中所做的是什么),并且完全按照我在初始问题中所写的做了。我只是想分享它,如果有人想重用它:-)
PHP不知道“准备开火”对您意味着什么。你必须写这部分。也许您可以创建一个包含所有必需参数的函数作为强制参数。在这种情况下,你不能忘记传递一些东西。(这可能是一个工厂或管理器类。)好的,是的,我知道PHP不能知道我脚本的“状态”。我只是想探索一下,是否有人知道PHP可以从我的类中获取所有声明的变量的函数或方法,并且基本上可以自动对它们运行isset()函数:-)您想知道您是否声明了这些变量,或者在这些变量中设置了任何值吗?第二部分很简单,如果
和检查,那么PHP是一种解释性语言,在到达那一行之前,它不能说声明了什么或没有声明什么。这就是我要找的。在这门课上学习了一段时间后,我遇到了一个小问题。我不能将反思仅限于当前班级,没有家长。你知道有没有一种方法可以在没有家长参与的情况下只反思当前的课程?我不这么认为。但是如果您只需要列出属性,那么您可以得到TargetClass的属性列表和它的父类的属性,并且您可以减去这两个集合。。。(不太好…)根据你的回答,我成功地创建了一个类,可以放在我的验证特征中,它完全符合我的要求。我将用代码回答我自己的问题。谢谢你对这个问题的输入,它也确实帮助我得出我的答案的结论。
function validate_state() {
if ( isset($this->some_property) )
....
}
protected function allPropertiesSet($self){
/*
* This class is dependent on the ReflectionClass.
* This class can be called with self::allPropertiesSet(get_class());
* The class can be called in any class who uses this trait, even if it is inherited. It's function is to validate if all your defined variables are set.
* It will return true if all variables are set, otherwise it will return false.
* Some credit goes to Lajos Veres from Stackoverflow for pointing me in the right direction.
* Author: André Valentin
* Created: 30-10-2013
*/
$class = new $self;
$reflect = new ReflectionClass($class);
$props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE | ReflectionProperty::IS_STATIC);
$prop_array = array();
foreach($props AS $prop){
$var_name = $prop->getName();
$class_name = $prop->class;
if($class_name == $self){
$prop_array[] = $var_name;
}
}
foreach($prop_array AS $value){
$var_name = $value;
if(!isset($this->$var_name)){
return false;
}
}
return true;
}