Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii2:如何获取$this的属性?_Php_Yii2 - Fatal编程技术网

Php Yii2:如何获取$this的属性?

Php Yii2:如何获取$this的属性?,php,yii2,Php,Yii2,我有一个模型类a和一个子类B class A extends \yii\base\Model { public $a1,$a2; } class B extends A { public $b1,$b2; } $o = new B(); 如何将$o的属性值作为数组获取,而只是从类B获取,而不是从类A获取 调用$o->attributes时,我得到['a1'=>…,'a2'=>…,'b1'=>…,'b2'=>…] 我的预期结果是['b1'=>…,'b2'=>…] 是否有一种Y

我有一个模型类a和一个子类B

class A extends \yii\base\Model {
    public $a1,$a2;
}

class B extends A {
    public $b1,$b2;
}

$o = new B();
如何将
$o
的属性值作为数组获取,而只是从
类B
获取,而不是从
类A
获取

调用
$o->attributes
时,我得到
['a1'=>…,'a2'=>…,'b1'=>…,'b2'=>…]

我的预期结果是
['b1'=>…,'b2'=>…]


是否有一种Yii2方法,或者我们必须依赖于某些PHP函数/语言功能?

您可以在类
B
中取消设置变量
$a1
$a2

。。。
B类扩展了A类{
公共预算b1元、b2元;
公共函数构造(){
未设置($this->a1,$this->a2);
}
}
...
在我的例子中,当我查看
$o->attributes
时。属性
a1
a2
仍然存在


但是变量值变得
*未初始化*
并且无法使用(
$o->a1
将引发并显示错误消息)。

您可以在类
B
构造中取消设置变量
$a1
$a2

。。。
B类扩展了A类{
公共预算b1元、b2元;
公共函数构造(){
未设置($this->a1,$this->a2);
}
}
...
在我的例子中,当我查看
$o->attributes
时。属性
a1
a2
仍然存在


但是变量值变得
*未初始化*
并且无法使用(
$o->a1
将引发并显示错误消息)。

您可以使用反射来枚举与所需类匹配的属性。

A类扩展\yii\base\Model{
公帑a1元、a2元;
}
B类扩展了A类{
公共预算b1元、b2元;
}
$o=新的B();
$ref=new\ReflectionClass(B::class);
$props=数组\过滤器(数组\映射(函数($property){
返回$property->class==B::class?$property->name:false;
},$ref->getProperties(\ReflectionProperty::IS_PUBLIC));
印刷品(道具);
/*
将打印
排列
(
[0]=>b1
[1] =>b2
)
*/

您可以使用反射来枚举与所需类匹配的属性。

A类扩展\yii\base\Model{
公帑a1元、a2元;
}
B类扩展了A类{
公共预算b1元、b2元;
}
$o=新的B();
$ref=new\ReflectionClass(B::class);
$props=数组\过滤器(数组\映射(函数($property){
返回$property->class==B::class?$property->name:false;
},$ref->getProperties(\ReflectionProperty::IS_PUBLIC));
印刷品(道具);
/*
将打印
排列
(
[0]=>b1
[1] =>b2
)
*/

如果您知道要获取哪些属性,可以在方法的第一个参数中命名它们,如下所示:

$attributes=$o->getAttributes(['b1','b2']);
如果需要所有属性,但不知道有哪些属性,可以使用父类的方法获取不需要的属性列表,并将其作为
getAttributes()
method的第二个参数传递以将其忽略

$except=A::instance()->attributes();
$attributes=$o->getAttributes(null,$except);

如果您知道要获取哪些属性,可以在方法的第一个参数中命名它们,如下所示:

$attributes=$o->getAttributes(['b1','b2']);
如果需要所有属性,但不知道有哪些属性,可以使用父类的方法获取不需要的属性列表,并将其作为
getAttributes()
method的第二个参数传递以将其忽略

$except=A::instance()->attributes();
$attributes=$o->getAttributes(null,$except);

不扩展
A
?这是大型代码库的一部分…生成一个只返回B类属性的函数不扩展
A
?这是大型代码库的一部分…生成一个只返回B类属性的函数