实现了一个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 相关文章推荐
模仿OSO的论坛(一)
Oct 09 PHP
发布一个用PHP fsockopen写的HTTP下载的类
Feb 22 PHP
php网上商城购物车设计代码分享
Feb 15 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
Jul 07 PHP
Thinkphp实现MySQL读写分离操作示例
Jun 25 PHP
PHP 5.3新增魔术方法__invoke概述
Jul 23 PHP
支持中文的PHP按字符串长度分割成数组代码
May 17 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
Dec 17 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 PHP
php实现微信分享朋友链接功能
Feb 18 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
Apr 15 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 观察者模式的实现代码
2013/05/10 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
拖动table标题实现改变td的大小(css+js代码)
2013/04/16 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
jquery实现左右滑动菜单效果代码
2015/08/27 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
JavaScript 闭包机制详解及实例代码
2016/10/10 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
vue实现简单表格组件实例详解
2017/04/16 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
vue中如何使用ztree
2018/02/06 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
vuex进阶知识点巩固
2018/05/20 Javascript
jquery.pager.js实现分页效果
2019/07/29 jQuery
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
python super函数使用方法详解
2020/02/14 Python
python Paramiko使用示例
2020/09/21 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
教师年度考核自我鉴定
2014/01/19 职场文书
土木工程专业推荐信
2014/02/19 职场文书
史学专业毕业生求职信
2014/05/09 职场文书
羽毛球比赛策划方案
2014/06/13 职场文书
2019个人工作计划书的格式及范文!
2019/07/04 职场文书
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server