实现了一个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基类的代码相关推荐

  1. 编写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle(圆形)、Square(正方形)、Rectangle(矩形)、Trapezoid(梯形)、Triangle(三角形)。用虚函数分

    编写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle(圆形).Square(正方形).Rectangle(矩形).Trapezoid(梯形).Triangle(三角形).用虚函数分 ...

  2. c++程序设计十二章第5题5 写一个程序,定义抽象基类shape由它派生出5个派生类:Circle(圆形),Square(正方形),Rectangle(矩形),Trapezoid(梯形),Tr

    写一个程序,定义抽象基类shape由它派生出5个派生类:Circle(圆形),Square(正方形),Rectangle(矩形),Trapezoid(梯形),Triangle(三角形).用虚函数分别计 ...

  3. iis7 php5 isapi配置,Win7 下 IIS7 配置 PHP5 (Isapi + FastCgi)

    之前有写过在 Apache 下配置 PHP5 的教程,而最近才知道 windows 自带的 IIS 平台对 PHP 也有很好的支持(刚学 PHP 不久),所以打算花点时间来倒腾倒腾,之后就写下这篇博客 ...

  4. Java基类共同属性设置_java – 你有一个Hibernate实体的基类吗?

    你有一个Hibernate实体的共同基类,即具有id,version和其他常见属性的MappedSuperclass?有什么缺点吗? 例: @MappedSuperclass() public cla ...

  5. 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 ...

  6. php5.5.33 源码安装,Linux PHP5.3升级PHP5.5.33

    由于要使用了laravel5.1,php要升级到5.5以上.具体环境是Aliyun Cent OS 7.0. 首先网上这类的文章非常多,每个人的升级目的,要升级的组件都不完全一样.最好的说明文档还是官 ...

  7. php5.5 集成环境,windows下配置php5.5开发环境及开发扩展_PHP

    网上的教程是比较多的,但是我发现在windows下的扩展开发比较少,而且大多都是php5.3版本以前的,今天我就给大家讲解一下php扩展开发,我就拿php5.5的版本来说明一下的了 windows环境 ...

  8. python简单代码演示效果-演示python如何创建和使用一个简单的元类的代码

    在做工程闲暇时间,将做工程过程比较重要的一些内容备份一下,如下内容段是关于演示python如何创建和使用一个简单的元类的内容,应该能对小伙伴们也有用途. #!/usr/bin/env python # ...

  9. python property方法_Python——property(使一个方法看起来就像类属性一样)

    """ 装饰器property: 使一个方法看起来就像类属性一样 """ #例子1 class A: def __init__(self, ...

最新文章

  1. 异步爬虫框架与协程浅析
  2. html模板是干嘛的,html模板有什么用
  3. 【隐私】大数据下的隐私威胁【转载】
  4. 计算机操作系统在线作业,【在线】电子科大17春《计算机操作系统》在线作业1...
  5. ICLR2020满分论文 | 为什么梯度裁剪能加速模型训练?
  6. VS Code 插件
  7. 毕业设计周记(第二篇)
  8. C语言子程序调用的入口参数和出口参数,C语言与DOS系统接口技术
  9. python plt 色卡
  10. Windows Azure AppFabric Caching入门简介
  11. tcl php,关于tcl语言
  12. Shell编程之常用内置命令
  13. 计算机视觉算法岗面试题
  14. orientdb java_OrientDB Java连接操作
  15. 【Windows Server 2019】活动目录 (Active Directory) ——创建、删除和管理对象、容器和组织单位(OU)
  16. 清除Zabbix的历史记录
  17. ospf及lsa总结
  18. 乔治亚大学招收计算机视觉/深度学习/机器人/自动驾驶博士生from 2023 spring
  19. Java集合面试题汇总【附答案】持续更新
  20. 2021年三季度中国生物制品行业A股上市企业营收排行榜:智飞生物业绩突出,8家企业新上榜(附热榜TOP42详单)

热门文章

  1. ubuntu下idea后台执行的方法
  2. SpringBoot中 pagehelper插件使用
  3. 您能解决这3个(看似)简单的Python问题吗?
  4. Postman和postwoman安装及简介
  5. 传感器和单片机主板之间远距离通讯应该有哪些保障处理措施
  6. hibernate中主键的生成策略
  7. Pytorch中model.eval()的作用分析
  8. PCA和线性回归之间的关系如何?
  9. Towards Efficient Privacy-Preserving Inspection of TLS Encrypted Traffic
  10. Java中String.split和StringUtils.split性能比较