实现了一个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 相关文章推荐
图形数字验证代码
Oct 09 PHP
无数据库的详细域名查询程序PHP版(2)
Oct 09 PHP
php 格式化数字的时候注意数字的范围
Apr 13 PHP
php删除页面记录 同时刷新页面 删除条件用GET方式获得
Jan 10 PHP
php静态文件返回304技巧分享
Jan 06 PHP
PHP实现通过正则表达式替换回调的内容标签
Jun 15 PHP
php生成静态html页面的方法(2种方法)
Sep 14 PHP
php生成gif动画的方法
Nov 05 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
Mar 21 PHP
php微信开发之上传临时素材
Jun 24 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 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
PHP实现用户认证及管理完全源码
2007/03/11 PHP
php扩展ZF――Validate扩展
2008/01/10 PHP
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
php强制下载文件函数
2016/08/24 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
JavaScript函数的4种调用方法详解
2014/04/22 Javascript
超详细的JS弹出窗口代码大全
2020/04/18 Javascript
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
Vue动态创建注册component的实例代码
2019/06/14 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
python定时检查某个进程是否已经关闭的方法
2015/05/20 Python
python中set常用操作汇总
2016/06/30 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
Django框架视图介绍与使用详解
2019/07/18 Python
python实现画循环圆
2019/11/23 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
澳大利亚百货公司:David Jones
2018/02/08 全球购物
世界领先的26岁以下学生和青少年旅行预订网站:StudentUniverse
2018/07/01 全球购物
简历中个人自我评价分享
2014/03/15 职场文书
工作建议书范文
2014/05/13 职场文书
私人委托书格式
2014/09/10 职场文书
婚育证明格式
2015/06/17 职场文书
党员学习中国梦心得体会
2016/01/05 职场文书
教育教学工作反思
2016/02/24 职场文书
求职自我评价参考范文
2019/05/16 职场文书
MySQL数据管理操作示例讲解
2022/12/24 MySQL