php5.5 getter setter,实现了一个PHP5的getter/setter基类的代码
实现了一个PHP5的getter/setter基类的代码 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的功能,其实很简单,就是再加一项,标识它能不能被改写就成
本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:php中文网
TAG标签: 脚本
php5.5 getter setter,实现了一个PHP5的getter/setter基类的代码相关推荐
- 编写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle(圆形)、Square(正方形)、Rectangle(矩形)、Trapezoid(梯形)、Triangle(三角形)。用虚函数分
编写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle(圆形).Square(正方形).Rectangle(矩形).Trapezoid(梯形).Triangle(三角形).用虚函数分 ...
- c++程序设计十二章第5题5 写一个程序,定义抽象基类shape由它派生出5个派生类:Circle(圆形),Square(正方形),Rectangle(矩形),Trapezoid(梯形),Tr
写一个程序,定义抽象基类shape由它派生出5个派生类:Circle(圆形),Square(正方形),Rectangle(矩形),Trapezoid(梯形),Triangle(三角形).用虚函数分别计 ...
- iis7 php5 isapi配置,Win7 下 IIS7 配置 PHP5 (Isapi + FastCgi)
之前有写过在 Apache 下配置 PHP5 的教程,而最近才知道 windows 自带的 IIS 平台对 PHP 也有很好的支持(刚学 PHP 不久),所以打算花点时间来倒腾倒腾,之后就写下这篇博客 ...
- Java基类共同属性设置_java – 你有一个Hibernate实体的基类吗?
你有一个Hibernate实体的共同基类,即具有id,version和其他常见属性的MappedSuperclass?有什么缺点吗? 例: @MappedSuperclass() public cla ...
- iis6 php5.3 mysql_Win 2003下IIS6+Mysql+php5.2 isapi搭建 升级php5.2到5.3测试 借助fastcgi实现...
Win 2003下IIS6+Mysql+php5.2 原环境isapi搭建 升级php5.2到5.3测试 借助fastcgi实现 操作如下 实验前准备:php-5.3.5-Win32-VC6-x86 ...
- php5.5.33 源码安装,Linux PHP5.3升级PHP5.5.33
由于要使用了laravel5.1,php要升级到5.5以上.具体环境是Aliyun Cent OS 7.0. 首先网上这类的文章非常多,每个人的升级目的,要升级的组件都不完全一样.最好的说明文档还是官 ...
- php5.5 集成环境,windows下配置php5.5开发环境及开发扩展_PHP
网上的教程是比较多的,但是我发现在windows下的扩展开发比较少,而且大多都是php5.3版本以前的,今天我就给大家讲解一下php扩展开发,我就拿php5.5的版本来说明一下的了 windows环境 ...
- python简单代码演示效果-演示python如何创建和使用一个简单的元类的代码
在做工程闲暇时间,将做工程过程比较重要的一些内容备份一下,如下内容段是关于演示python如何创建和使用一个简单的元类的内容,应该能对小伙伴们也有用途. #!/usr/bin/env python # ...
- python property方法_Python——property(使一个方法看起来就像类属性一样)
""" 装饰器property: 使一个方法看起来就像类属性一样 """ #例子1 class A: def __init__(self, ...
最新文章
- 异步爬虫框架与协程浅析
- html模板是干嘛的,html模板有什么用
- 【隐私】大数据下的隐私威胁【转载】
- 计算机操作系统在线作业,【在线】电子科大17春《计算机操作系统》在线作业1...
- ICLR2020满分论文 | 为什么梯度裁剪能加速模型训练?
- VS Code 插件
- 毕业设计周记(第二篇)
- C语言子程序调用的入口参数和出口参数,C语言与DOS系统接口技术
- python plt 色卡
- Windows Azure AppFabric Caching入门简介
- tcl php,关于tcl语言
- Shell编程之常用内置命令
- 计算机视觉算法岗面试题
- orientdb java_OrientDB Java连接操作
- 【Windows Server 2019】活动目录 (Active Directory) ——创建、删除和管理对象、容器和组织单位(OU)
- 清除Zabbix的历史记录
- ospf及lsa总结
- 乔治亚大学招收计算机视觉/深度学习/机器人/自动驾驶博士生from 2023 spring
- Java集合面试题汇总【附答案】持续更新
- 2021年三季度中国生物制品行业A股上市企业营收排行榜:智飞生物业绩突出,8家企业新上榜(附热榜TOP42详单)
热门文章
- ubuntu下idea后台执行的方法
- SpringBoot中 pagehelper插件使用
- 您能解决这3个(看似)简单的Python问题吗?
- Postman和postwoman安装及简介
- 传感器和单片机主板之间远距离通讯应该有哪些保障处理措施
- hibernate中主键的生成策略
- Pytorch中model.eval()的作用分析
- PCA和线性回归之间的关系如何?
- Towards Efficient Privacy-Preserving Inspection of TLS Encrypted Traffic
- Java中String.split和StringUtils.split性能比较