Home > Backend Development > PHP Tutorial > Code that implements a PHP5 getter/setter base class_PHP tutorial

Code that implements a PHP5 getter/setter base class_PHP tutorial

WBOY
Release: 2016-07-21 15:57:22
Original
823 people have browsed it

Both PHP3 and PHP4 have classes, but their class definitions are really not decent, and their efficiency is quite embarrassing. However, the data says that PHP5 has restructured object-oriented support. Although it is not completely object-oriented, it can be used. Meet someone.
I started this thing last night when I was bored. I feel that the class member permission keyword added in PHP5 is very good, but the problem comes again. It seems that there is no convenient way to define the getter and setter of the field. The traditional The way is defined like this:

class a
{
private $field;
public function get_field() { return $this->$field; }
public function set_field ($value) { $this->field = $value; }
}

Although it is easy to implement, to be honest, it is really uncomfortable to write this bunch of code for a field. .
So I thought about whether there was a more convenient way to solve it and easily define its type restrictions or something.
I’ve been tinkering with it for a long time (I can’t help it, I’m not familiar with it.)), finally came up with a class to solve this problem:

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("The property does not exist");
}
}
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))
                                           "] = $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的功能,其实很简单,就是再加一项,标识它能不能被改写就成

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/317883.htmlTechArticle Both PHP3 and PHP4 have classes, but their class definitions are really not decent, and their efficiency is quite embarrassing. But the information says that PHP5 has restructured object-oriented support, although it is not completely oriented...
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template