实现了一个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 SQL之where语句生成器
Mar 24 PHP
php笔记之:有规律大文件的读取与写入的分析
Apr 26 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
May 10 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
May 28 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
Jul 04 PHP
thinkphp模板继承实例简述
Nov 26 PHP
php动态函数调用方法
May 21 PHP
常见PHP数据库解决方案分析介绍
Sep 24 PHP
Symfony2学习笔记之插件格式分析
Mar 17 PHP
php使用变量动态创建类的对象用法示例
Feb 06 PHP
PHP不使用内置函数实现字符串转整型的方法示例
Jul 03 PHP
php策略模式简单示例分析【区别于工厂模式】
Sep 25 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读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
PHP异常类及异常处理操作实例详解
2018/12/19 PHP
过虑特殊字符输入的js代码
2010/08/05 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
Node.js编程中客户端Session的使用详解
2015/06/23 Javascript
javascript实现tab切换特效
2015/11/12 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
浅谈如何通过node.js对数据进行MD5加密
2018/05/16 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
微信小程序云开发详细教程
2019/05/16 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
Python装饰器结合递归原理解析
2020/07/02 Python
零基础学python应该从哪里入手
2020/08/11 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
BIBLOO波兰:捷克的一家在线服装店
2018/03/09 全球购物
莫斯科的韩国化妆品店:Sifo
2019/12/04 全球购物
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
医大实习自我鉴定
2013/12/07 职场文书
医院检讨书范文
2014/02/01 职场文书
项目合作意向书范本
2014/04/01 职场文书
倡议书范文格式
2014/05/12 职场文书
初中学校对照检查材料
2014/08/19 职场文书
职工宿舍管理制度
2015/08/05 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS
一条 SQL 语句执行过程
2022/03/17 MySQL