一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

實現了一個PHP5的getter/setter基類的代碼

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技術實現了一個PHP5的getter/setter基類的代碼,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲一区二区在线视频 | 国产级a爱做片免费观看 | 九九在线精品视频 | 国产v2ba最新在线观看 | 大象焦伊人久久综合网色视 | 曰本还a大片免费无播放器 曰本视频网络www色 | 色亚洲视频 | 人人干在线观看 | 国产2021成人精品 | 国内精品美女久久久久 | 黄网页在线观看 | 一区二区视频在线免费观看 | 亚洲精品高清视频 | 免费观看欧美一级特黄 | 亚洲狠狠| 欧美极品美軳人人体 | 狠狠综合久久综合鬼色 | 国产综合91天堂亚洲国产 | 日本3级网站 | 在线看www免费看 | 欧美亚洲综合另类成人 | 色啊色| 国产一二三区视频 | 成年黄网站 | 久久久久久久综合 | 国产真实乱子伦xxxx仙踪 | 久久久久久88色愉愉 | 99视频有精品视频免费观看 | 中文字幕日韩欧美一区二区三区 | 91碰视频| 天天做天天爱天天爽天天综合 | 国产精品视频一区二区三区小说 | 97在线影院| 亚洲欧洲色天使日韩精品 | 久久精品国产91久久综合麻豆自制 | 白丝美女被狂躁视频免费网站 | 久久久久久久久久毛片精品美女 | 色偷偷亚洲女人天堂观看欧 | 国产精品自拍第一页 | 国产一级特黄一级毛片 | 性欧美xxxx视频在线观看 |