实现了一个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 求质素(素数) 的实现代码
Apr 12 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
Dec 29 PHP
在windows服务器开启php的gd库phpinfo中未发现
Jan 13 PHP
php实现在服务器端调整图片大小的方法
Jun 16 PHP
详解php魔术方法(Magic methods)的使用方法
Feb 14 PHP
PHP Smarty模版简单使用方法
Mar 30 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
Jul 07 PHP
基于PHP制作验证码
Oct 12 PHP
PHP实现的文件上传类与用法详解
Jul 05 PHP
PDO::query讲解
Jan 29 PHP
用PHP的反射实现委托模式的讲解
Mar 22 PHP
深入解析PHP底层机制及相关原理
Dec 11 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
星际争霸任务指南——人族
2020/03/04 星际争霸
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
php基础知识:控制结构
2006/12/13 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
Yii控制器中操作视图js的方法
2016/07/04 PHP
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
理解JavaScript的caller,callee,call,apply
2009/04/28 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
JavaScript立即执行函数的三种不同写法
2014/09/05 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
深入理解js中this的用法
2016/05/28 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
详解使用Next.js构建服务端渲染应用
2018/07/10 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
vue项目中使用bpmn-自定义platter的示例代码
2020/05/11 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
vue 中的动态传参和query传参操作
2020/11/09 Javascript
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
详解Python编程中基本的数学计算使用
2016/02/04 Python
Python生成器定义与简单用法实例分析
2018/04/30 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
5 分钟读懂Python 中的 Hook 钩子函数
2020/12/09 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
C#可否对内存进行直接的操作
2015/02/26 面试题
心理健康课教学反思
2014/02/13 职场文书
成人继续教育实施方案
2014/03/01 职场文书
股权转让协议书
2014/04/12 职场文书
建筑工程专业大学生求职信
2014/04/23 职场文书
任命书格式
2014/06/05 职场文书
生物学专业求职信
2014/07/23 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
债务纠纷委托书范本
2014/10/14 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书