实现了一个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生成带有雪花背景的验证码
Oct 09 PHP
深入Apache与Nginx的优缺点比较详解
Jun 17 PHP
zf框架的zend_cache缓存使用方法(zend框架)
Mar 14 PHP
Thinkphp中的curd应用实用要点
Jan 04 PHP
PHP树-不需要递归的实现方法
Jun 21 PHP
PHP文件上传处理案例分析
Oct 15 PHP
php头像上传预览实例代码
May 02 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
Jun 19 PHP
Ajax+PHP实现的删除数据功能示例
Feb 12 PHP
在PHP中输出JS语句以及乱码问题的解决方案
Feb 13 PHP
laravel-admin 实现在指定的相册下添加照片
Oct 21 PHP
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
Apr 16 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
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
Laravel用户授权系统的使用方法示例
2018/09/16 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
2019/12/13 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
Moment.js 不容错过的超棒Javascript日期处理类库
2012/04/15 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
nodeJS实现路由功能实例代码
2017/06/08 NodeJs
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
jQuery实现带进度条的轮播图
2020/09/13 jQuery
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
Python中使用PDB库调试程序
2015/04/05 Python
Python的地形三维可视化Matplotlib和gdal使用实例
2017/12/09 Python
分析经典Python开发工程师面试题
2019/04/08 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
python线程的几种创建方式详解
2019/08/29 Python
python库matplotlib绘制坐标图
2019/10/18 Python
django 取消csrf限制的实例
2020/03/13 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
澳洲CFL商城:CHEMIST FOR LESS(中文)
2021/02/28 全球购物
四风对照检查材料思想汇报
2014/09/20 职场文书
酒店工程部经理岗位职责
2015/04/09 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
大学生心理健康教育心得体会
2016/01/12 职场文书
《观察物体》教学反思
2016/02/17 职场文书
学校教代会开幕词
2016/03/04 职场文书
goland 设置project gopath的操作
2021/05/06 Golang
Python测试框架pytest高阶用法全面详解
2022/06/01 Python