开发者社区> 技术小甜> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

PHP动态属性和stdclass

简介:
+关注继续查看

动态属性不是PHP专有的,很多解释型语言都有这个功能,比如javascript。它可以动态的为其对象添加删除属性。PHP也可以动态的添加属性,如下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
class testClass
{
public $A='a';
}
$t=new testClass();
echo $t->A,'<br>';
echo 'B isset=',isset($t->B)?'Y':'N','<br>';//$t中并没有变量B
$t->B='b';//$t中给添加了变量B,并且赋值。
echo 'B isset=',isset($t->B)?'Y':'N','<br>';
echo '$t->B=',$t->B,'<br>';
unset($t->B);//$t中给删除变量B。
echo 'B isset=',isset($t->B)?'Y':'N','<br>';

这让人想起PHP中的魔术方法,__get和__set,这两个魔术方法也可以完成这种类似的功能,但是使用他们就显得复杂。因此只有当一些比较复杂的情况下才会使用 这魔术方法。

有了这种动态属性添加的能力,你可以定义一个空的类,然后随时随地,在要用到属性的时候自动添加,很方便。

这种动态属性添加的能力,在类型转换的时候显得很有用。在类型转换的时候,不得不提到stdClass,它是PHP中一个保留的类。官方文档对于这个stdClass描述甚少。下面官方文档的描述:

Converting to object

If an object is converted to an object, it is not modified. If a value of any other type is converted to an object, a new instance of the stdClass built-in class is created. If the value was NULL, the new instance will be empty. Arrays convert to an objectwith properties named by keys, and corresponding values. For any other value, a member variable named scalar will contain the value.

1
2
3
4
<?php   
$obj = (object) 'ciao';    
echo $obj->scalar;  // outputs 'ciao'    
?>


简单的说,就是一个某种类型的值转换成对象时候,就会创建一个stdClass的实例。再看文档中提供例子,一个标量类型的值,转换成object。

进一步,如果运行如下代码:

1
echo '$obj instanceof stdClass=',($obj instanceof stdClass)?'Y':'N','<br>';

我们得到的结果是:

$obj instanceof stdClass=Y

也就是说转变成对象的时候,是创建了一个stdClass,然后再动态添加属性并且赋值。用var_dump方法也可以看出类型是stdClass。

理论上,我们可以手动的实例化一个stdClass,并通过var_dump查看他。

1
2
3
4
<?php
$s=new stdClass();
var_dump($s);
?>

得到的结果就是

object(stdClass)[1]
也就是说stdClass既没有属性也没有任何方法,是一个空的对象。
有不少人认为stdClass类似C#中的object,认为PHP中所有的类都继承于stdClass,这是错误的,下面的代码就能说明问题了。
1
2
3
class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
因此可以总结如下:
stdClass是PHP保留的,没有属性也没有任何方法的一个空对象,其作用就是为了在对象转换时候,生成它,并且动态的添加属性来完成对象的赋值。

参考文档:

http://krisjordan.com/dynamic-properties-in-php-with-stdclass

http://php.net/manual/en/language.types.object.php


















本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/1301423 ,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
grape动态PHP结构(三)——API接口
这里的v1、v2就是模块,由于客户端版本一直在迭代的,那么一些老版本的客户端调用的接口就得保留起来,使得兼容。新版本就直接调用新接口。
0 0
grape动态PHP结构(二)——管理后台
indexController.php中写了些简短的demo,引用dao层、调用rpc、测试调用等。
0 0
grape动态PHP结构(一)——目录结构与配置文件
结构的名字grape,中文名叫葡萄,因为最近一个同事经常带葡萄到公司给我们吃,受到启发想到了这个名字。
0 0
ECS配置mySQL\MariaDB和PHP环境
ECS配置mySQL\MariaDB和PHP环境
0 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
PHP安全开发_从白帽角度做安全
立即下载
PHP在机器学习上的应用及云深度学习平台的架构设计与实现
立即下载
PHP与APM_技术内幕和最佳实践
立即下载