php+项目的基类怎么写,实现了一个PHP5的getter/setter基类的代码

本文介绍了一种在PHP5中优化类的getter和setter的方法,通过定义一个结构化的数组来指定字段的类型、默认值和是否允许NULL。这个基类能够自动进行类型检查,提高代码的简洁性和可维护性。测试示例展示了如何使用这个抽象基类创建具有类型约束的实例。
摘要由CSDN通过智能技术生成

实现了一个PHP5的getter/setter基类的代码

更新时间:2007年02月25日 00:00:00   作者:

PHP3、PHP4都拥有类,但它们的类定义的实在很不像样,效率还挺难为情的,但资料上说PHP5重新构造了面向对象的支持,尽管并不是完全面向对象,但也算能拿出来见人了。

昨天晚上闲着无聊便弄起这玩意,感觉PHP5增加的类成员权限关键字挺好,但问题又来了,似乎还没一种方便的方式可以定义字段的getter以及setter,传统的方式是这样定义的:

class a

{

private $field;

public function get_field() { return $this->$field; }

public function set_field($value) { $this->field = $value; }

}

虽然实现起来挺容易,但是说实在的,为一个字段去写这一堆代码还真不爽。。

于是便思索着是不是有一种更方便的方式来解决,并且可以方便地定义它的类型限制什么的。

捣鼓了半天(没办法,对它不熟。。),终于弄出一个类来解决这个问题:

class abstract_entity

{

private $fields;

private $sys_type = array(

"bool" => "",

"array" => "",

"double" => "",

"float" => "",

"int" => "",

"integer" => "",

"long " => "",

"null" => "",

"object" => "",

"real" => "",

"resource" => "",

"string" => ""

// "mixed" and "number"

);

protected function __construct($fields)

{

/*********************************\

* $fields = array(

*     "id" = array(

*        "allow_null" = false,

*        "value" = 1,

*        "type" = "int"

*     );

* );

\**********************************/

$this->fields = $fields;

}

public function __get($key)

{

if(array_key_exists($key, $this->fields))

{

return $this->fields[$key]["value"];

}

else

{

throw new Exception("该属性不存在");

}

}

public function __set($key, $value)

{

if(array_key_exists($key, $this->fields))

{

$allow_null = $this->fields[$key]["allow_null"];

$type = $this->fields[$key]["type"];

if(array_key_exists($type, $this->sys_type))

{

$fun = create_function('$value', "return is_$type($value);");

if(@$fun($value))

{

$this->fields[$key]["value"] = $value;

}

else if($allow_null && is_null($value))

{

$this->fields[$key]["value"] = NULL;

}

else

{

throw new Exception("该值类型不正确,必须为" . $type . "类型");

}

}

else if($type == "mixed")

{

if(!is_null($value))

{

$this->fields[$key]["value"] = $value;

}

else if($allow_null)

{

$this->fields[$key]["value"] = NULL;

}

else

{

throw new Exception("该值不允许为NULL值");

}

}

else if($type == "number")

{

if(is_int($value) || is_float($value))

{

$this->fields[$key]["value"] = $value;

}

else if(is_null($value) && $allow_null)

{

$this->fields[$key]["value"] = NULL;

}

else

{

throw new Exception("该值类型不正确,必须为" . $type . "类型");

}

}

else

{

if(class_exists($type) || interface_exists($type))

{

if(is_subclass_of($value, $type))

{

$this->fields[$key]["value"] = $value;

}

else if(is_null($value) && $allow_null)

{

$this->fields[$key]["value"] = NULL;

}

else

{

throw new Exception("该值类型不正确,必须为" . $type . "类型");

}

}

else if(is_null($value) && $allow_null)

{

$this->fields[$key]["value"] = NULL;

}

}

}

else

{

throw new Exception("该属性不存在");

}

}

}

通过定义一个一定格式的array可以比较方便地定义该字段的类型、是否允许NULL值以及默认值。

测试代码如下:

class test extends abstract_entity

{

public function __construct()

{

$define = array(

"id" => array(

"allow_null" => false,

"value" => 1,

"type" => "int"

),

"name" => array(

"allow_null" => false,

"value" => "abc",

"type" => "string"

),

"gender" => array(

"allow_null" => false,

"value" => true,

"type" => "bool"

),

"ins" => array(

"allow_null" => false,

"value" => $this,

"type" => "test"

),

"ins1" => array(

"allow_null" => true,

"value" => $this,

"type" => "test"

),

"ins2" => array(

"allow_null" => true,

"value" => NULL,

"type" => "config_media_type"

)

);

parent::__construct($define);

}

}

$a = new test();

$a->id = 123;

eche $a->id;

echo $a->ins1;

$a->ins1 = NULL;

echo is_null($a->ins1);

这里边实现了getter以及setter,但由于时间关系我没去实现readonly的功能,其实很简单,就是再加一项,标识它能不能被改写就成

相关文章

1a1b05c64693fbf380aa1344a7812747.png

这篇文章主要介绍了PHP面向对象程序设计之类与反射API,结合实例形式较为详细的分析了类的验证、检查、传参及反射API等概念与操作技巧,需要的朋友可以参考下2016-12-12

4f55910a645b073bc4fc65dc10dc14bd.png

这篇文章主要介绍了php使用cookie保存登录用户名的方法,包括提交页面及设置cookie的方法,需要的朋友可以参考下2015-01-01

0ea3c7666119d5615e582f823fb3fad6.png

全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点,需要的朋友可以参考下。2011-01-01

4f96a78db829b1556ff16de21e013c7a.png

add_post事件里的代码,就清楚要接收什么数据,如何验证数据能够在第一眼有个大致了解,所以总结出了此方式2014-10-10

8cc1031babc6aff2319f1c6af8544aa0.png

这篇文章主要介绍了PHP获取当前执行php文件名的代码,需要的朋友可以参考下2017-03-03

0c932a99bb7b6f23c937db507070cc7b.png

这篇文章主要介绍了PHP限制HTML内容中图片必须是本站的方法,涉及对URL中域名的判定技巧,需要的朋友可以参考下2015-06-06

cca732bf65a93ed2ec0ac80c638460fe.png

这篇文章主要介绍了PHP实现的简单缓存类,实例分析了php缓存文件的定义及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下2015-07-07

2d9f31f2af7b675a3d153d2b7f1035a7.png

这篇文章主要介绍了php将textarea数据提交到mysql出现很多空格的解决方法,分析了空格出现的原因以及删除空格的简单实现技巧,非常具有实用价值,需要的朋友可以参考下2014-12-12

b452cee8ec5cd9e58ab98eba17281e59.png

记得上次有过一个叫采集后的处理这个就是它的升级版本 连采再处理,合成一本书txt的。2009-03-03

f4838ec7e2d4da28e0b57d4e852dadd4.png

这篇文章主要介绍了PHP实现接收二进制流转换成图片的方法,结合实例形式分析了php文件、目录及图形操作的相关技巧,需要的朋友可以参考下2017-01-01

最新评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值