实现了一个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 相关文章推荐
多重?l件?合查?(一)
Oct 09 PHP
PHP5+UTF8多文件上传类
Oct 17 PHP
PHP实现多条件查询实例代码
Jul 17 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
php中CI操作多个数据库的代码
Jul 05 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
Sep 07 PHP
PHP之短标签开启设置
Jun 17 PHP
php中使用gd库实现下载网页中所有图片
May 12 PHP
PHP面向对象程序设计OOP继承用法入门示例
Dec 27 PHP
PHP框架自动加载类文件原理详解
Jun 06 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
Laravel + Elasticsearch 实现中文搜索的方法
Feb 02 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下MAIL的另一解决方案
2006/10/09 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
2016/06/06 PHP
javascript 动态添加表格行
2006/06/22 Javascript
用javascript自动显示最后更新时间
2007/03/15 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
jquery选择器原理介绍($()使用方法)
2014/03/25 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
微信小程序wepy框架笔记小结
2018/08/08 Javascript
layer.confirm取消按钮绑定事件的方法
2018/08/17 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
Python操作SQLite简明教程
2014/07/10 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
爱情保证书
2015/01/17 职场文书
社区三八妇女节活动总结
2015/02/06 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
酒桌上的开场白
2015/06/01 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书