实现了一个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 相关文章推荐
关于Intype一些小问题的解决办法
Mar 28 PHP
深入解析php之sphinx
May 15 PHP
PHP register_shutdown_function函数的深入解析
Jun 03 PHP
去除php注释和去除空格函数分享
Mar 13 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
Oct 29 PHP
php使用ereg验证文件上传的方法
Dec 16 PHP
使用GD库生成带阴影文字的图片
Mar 27 PHP
详解WordPress中分类函数wp_list_categories的使用
Jan 04 PHP
详解php中空字符串和0之间的关系
Oct 23 PHP
CI框架中类的自动加载问题分析
Nov 21 PHP
PHP中的函数声明与使用详解
May 27 PHP
phpfpm的作用和用法
Oct 10 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项目中比较通用的php自建函数的详解
2013/06/06 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
2007/12/08 Javascript
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
2008/03/22 Javascript
javascript Prototype 对象扩展
2009/05/15 Javascript
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
javascript基本类型详解
2014/11/28 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
浅谈python爬虫使用Selenium模拟浏览器行为
2018/02/23 Python
Python中按键来获取指定的值
2019/03/02 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
学期自我鉴定范文
2013/10/01 职场文书
财务人员求职自荐书范文
2014/02/10 职场文书
升学宴主持词
2014/04/02 职场文书
捐资助学倡议书
2014/04/15 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
高三生物教学反思
2016/02/22 职场文书
导游词之阳朔遇龙河
2019/12/16 职场文书
Python 使用dict实现switch的操作
2021/04/07 Python
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL
SONY600GR,国产收音机厂商永远的痛
2022/04/05 无线电
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL