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


Posted in PHP onFebruary 25, 2007

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 相关文章推荐
用PHP和ACCESS写聊天室(五)
Oct 09 PHP
php intval的测试代码发现问题
Jul 27 PHP
php 文章采集正则代码
Dec 28 PHP
PHP session会话的安全性分析
Sep 08 PHP
php获取中文拼音首字母类和函数分享
Apr 24 PHP
yii操作cookie实例简介
Jul 09 PHP
php中的观察者模式简单实例
Jan 20 PHP
ThinkPHP数据操作方法总结
Sep 28 PHP
PHP入门教程之会话控制技巧(cookie与session)
Sep 11 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
PHP-FPM和Nginx的通信机制详解
Feb 01 PHP
php公用函数列表[正则]
Feb 22 #PHP
发布一个用PHP fsockopen写的HTTP下载的类
Feb 22 #PHP
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
Feb 22 #PHP
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 #PHP
珊瑚虫IP库浅析
Feb 15 #PHP
PHP中HTTP方式下的Gzip压缩传输方法举偶
Feb 15 #PHP
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
Feb 15 #PHP
You might like
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
ThinkPHP模板IF标签用法详解
2014/07/01 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
2014/07/12 PHP
Linux中为php配置伪静态
2014/12/17 PHP
PHP答题类应用接口实例
2015/02/09 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
Python天气预报采集器实现代码(网页爬虫)
2012/10/07 Python
Python将阿拉伯数字转换为罗马数字的方法
2015/07/10 Python
Python常用的爬虫技巧总结
2016/03/28 Python
Python随机数random模块使用指南
2016/09/09 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
Python基于WordCloud制作词云图
2019/11/29 Python
Python requests设置代理的方法步骤
2020/02/23 Python
Jupyter加载文件的实现方法
2020/04/14 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
辩论赛主持词
2014/03/18 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
幼儿园教师读书笔记
2015/06/29 职场文书
2016见义勇为事迹材料汇总
2016/03/01 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js