继承已为大家所熟知的一个程序设计特性,PHP 的对象模型也使用了继承。继承将会影响到类与类,对象与对象之间的关系。比如,当扩展一个类,子类就会继承父类所有公有的和受保护的方法。除非子类覆盖了父类的方法,被继承的方法都会保留其原有功能。继承对于功能的设计和抽象是非常有用的,而且对于类似的对象增加新功能就无须重新再写这些公用的功能。Note:除非使用了自动加载,否则一个类必须在使用之前被定义。如果一个类扩展了另...
自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。Traits 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它...
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。接口中定义的所有方法都必须是公有,这是接口的特性。实现(implements)要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。Note:实现...
很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本开头写一个长长的包含文件列表(每个类一个文件)。在 PHP 5 中,不再需要这样了。可以定义一个 __autoload() 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。Tipspl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载。因此,不再...
在php5 的对象编程经常提到的一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。下面通过一些例子来说明。php的引用是别名,就是两个不同的变量名字指向相同的内容。在php5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标...
PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法。我们是通过魔术方法(magic methods)来实现的。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。所有的重载方法都必须被声明为 public。注意:1)这些魔术方法的参数都不能通过引用传递。2)PHP中的"重载"与其它绝大多数面向对象语言不同。传统的"重载"是用于提供多个同名的类方法,但各方法的参数类型和个数不同。属性重载public void__set(...
PHP 5 中的对象比较要比 PHP 4 中复杂,所期望的结果更符合一个面向对象语言。当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值 都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等。而如果使用全等运算符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。通过下面的示例可以理解以上原则。Example #1 PHP 5 的对象比较<?php function bool2str($bool) {if...
在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个 GTK 窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况:如果对象 A 中保存着对象 B 的引用,当你复制对象 A 时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那...
/** * PHP 对象、数组间的转换 * * @author flyer0126 * @since 2012/05/03 **/// 1. 利用(array)和(object),简单处理$objTemp = (object)array();$objTemp->a = 1;$objTemp->b = 2;$objTemp->c = 3;$arrTemp = (array)$objTemp;print_r($objTemp);print_r($arrTemp); /**stdClass Object( [a] => 1 [b] => 2 [c] => 3)Array( [a] => 1 [b] => 2 [c] => 3)**/// PS:简单的(array)和(object)只能处理单层的数据,...
PHP 5 提供了一种定义对象的方法使其可以通过单元列表来遍历,例如用 foreach 语句。默认情况下,所有可见属性都将被用于遍历。Example #1 简单的对象遍历class MyClass {public $var1 = 1;public $var2 = 2;public $var3 = 3;protected $protected = protected var;private $private = private var;function iterateVisible(){echo "MyClass::iterateVisible:<br>";foreach($this as $key => $value){print "$key=>$value<br>";}}...
所谓的序列化对象就是在会话中存放对象所有php里面的值都可以使用函数 serialize()来返回一个包含字节流的字符串来表示。 unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。为了能够 unserialize()一个对象,这个对象的类必须已经定义过。如果序列化类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。 如果要想在另...
当一个生成器函数被第一次调用,会返回一个内部Generator类的对象. 这个对象以和前台迭代器对象几乎同样的方式实现了Iterator 接口。Generator 类中的大部分方法和Iterator 接口中的方法有着同样的语义, 但是生成器对象还有一个额外的方法: send().CautionGenerator 对象不能通过new实例化Example #1 The Generator class<?phpclass Generator implements Iterator {public function rewind(); //Rewinds the iterator. 如果迭代已...
最近在做CactiEZ的二次开发, 在将对象转化成json串之后发现中文变成了unicode编码, 几经周折终于解决了。 记录下解决办法,希望能够帮助到遇到同样问题的朋友。 //json_encode()函数在php5.4.0之后可以通过传入参数JSON_UNESCAPED_UNICODE保持中文原样, 不进行Unicode 转码. echo unicode_decode(json_encode($response)); function unicode_decode($name) {// 转换编码,将Unicode编码转换成可以浏览的utf-8编码$pattern = /([\w...
应用程序在某一时刻,可能需要在数据库中存储“大”数据。“大”通常意味着“大约 4kb 或以上”,尽管某些数据库在数据达到“大”之前可以轻松地处理多达 32kb 的数据。大对象本质上可能是文本或二进制。在PDOStatement::bindParam() 或 PDOStatement::bindColumn()调用中使用 PDO::PARAM_LOB 类型码可以让 PDO 使用大数据类型。PDO::PARAM_LOB 告诉 PDO 作为流来映射数据,以便能使用 PHP Streams API 来操作。Example #1 从数据库...
自 PHP 5.2.0 起,JSON 扩展默认内置并编译进了 PHP。JSON 序列化接口JsonSerializable实现 JsonSerializable 的类可以 在 json_encode() 时定制他们的 JSON 表示法。JsonSerializable::jsonSerialize — 指定需要被序列化成 JSON 的数据Example #1 返回一个数组<?phpclass ArrayValue implements JsonSerializable {public function __construct(array $array) {$this->array = $array;}public function jsonSerialize() {return...