您的位置:首页 > 编程语言 > PHP开发

PHP面向对象高级特性初探

2013-12-08 00:00 681 查看
摘要: PHP5引入大量的面向对象的特性,也使得PHP更加方便实用。最近开始深入了解PHP的OOP特性,记录简单的学习心得。

<?php
//实例作为函数参数传递时,在实例变量前加上类名做类型说明,因为类是一个类也是一个类型
class DomainObject() {
private $cjp;
public function getCjp() {
return $this->cjp;
}
}
class otherObject() {
function __construct(DomainObject $aObject) {
$object = $aObject;
}
}

//静态方法 static 类访问属性
//静态方法 static function 可以访问静态属性,不能访问一般属性
//不能用$this伪变量访问静态方法,可以通过self或者直接类名::
class StaticExample {
static public $sNum = 0;
static public function sayHello() {
self::$sNum++;
print "hello (".self::$sNum.")\n";
}
}

//常量属性声明  const ACOUNT

//抽象类(abstract class)定义,只定义子类需要的方法,子类继承父类具体化抽象方法
//借口 interface 纯粹的模板,子类需继承借口所有方法,一个子类可以实现任意个借口

//延迟静态绑定:static关键字
//这是在PHP5.3之后引入的。
abstract class DomainObject() {
public static function create() {
return new self();
}
}
class Document extends DomainObject {
}
Document::create();
//运行这段代码,报错:PHP Fatal error: Cannot instantiate abstract class  DomainObject in ...
//这是因为self被解析定义为create(),self是解析上下文而不是调用上下文;
//下面通过静态上下文实用继承关系:
abstract class DomainObject() {
public static function create() {
return new static();
}
}
class Document extends DomainObject {
}
print_r(Document::create());
//打印出来的是Document Object

//static 不仅仅可以用于实例化,还可以想self和parent一样作为静态方法的调用标识符
abstract class DomainObject() {
private $group;
public function __construct() {
$this->group = static::getGroup();
}
public static function create() {
return new static();
}
static function getGroup() {
return "default";
}
}

//final 终止对象的继承
final class Checkout() {
}
class secondCheck extends Checkout {
}
//运行代码报错:...may not inherit form final class...

//实用拦截器方法获取信息
class autoAction {
function __get($property) {
// 访问未定义的属性时被调用
}
function __set($property, $value) {
// 给未被定义的属性赋值时调用
}
function __isset($property) {
// 对未定义的属性调用isset()时调用
}
function __unset($property) {
// 对未定义的属性调用unset()时调用
}
function __call($method, $arg_array) {
//调用未被定义的方法是调用
}
}
//__call()方法十分有用!他可以接受两个参数,一个方法名称,一个传递给调用方法的所有参数;
//这样,__call()方法可以实现方法委托(相当于继承)和错误处理
class PersonWriter {
function writeName( Perons $p ) {
print $p->getName();
}
function writeAge( Person $p ) {
print $p->getAge();
}
}
class Person() {
private $writer;
function __construct( PersonWriter $writer ) {
$this->write = $writer;
}
function __call( $methodName, $args ) {
if ( method_exists( $this->writer, $methodName ) ) {
return $this->writer->$methodName( $this );
}
}
function getName() {
return "cjp";
}
function getAge() {
return "22";
}
}
//通过这样调用:
$person = new Person( new PersonWriter() );
$person->writeName();
//这样,person神奇的添加了两个方法,相当于继承了PersonWriter。
//委托可以节省很多时间,但代码也会变得不太清晰
//
//析构方法__construct(),当对象实例化的时候__construct()自动被执行
//析构方法__destruct(), 在对象被垃圾收集器收集之前被调用,可以做一些清理工作
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息