|
昨天晚上閑著無(wú)聊便弄起這玩意,感覺(jué)php5增加的類(lèi)成員權(quán)限關(guān)鍵字挺好,但問(wèn)題又來(lái)了,似乎還沒(méi)一種方便的方式可以定義字段的getter以及setter,傳統(tǒng)的方式是這樣定義的:
class a
{
private $field;
public function get_field() { return $this->$field; }
public function set_field($value) { $this->field = $value; }
}
雖然實(shí)現(xiàn)起來(lái)挺容易,但是說(shuō)實(shí)在的,為一個(gè)字段去寫(xiě)這一堆代碼還真不爽。。
于是便思索著是不是有一種更方便的方式來(lái)解決,并且可以方便地定義它的類(lèi)型限制什么的。
搗鼓了半天(沒(méi)辦法,對(duì)它不熟。。),終于弄出一個(gè)類(lèi)來(lái)解決這個(gè)問(wèn)題:
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("該值類(lèi)型不正確,必須為" . $type . "類(lèi)型");
}
}
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("該值類(lèi)型不正確,必須為" . $type . "類(lèi)型");
}
}
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("該值類(lèi)型不正確,必須為" . $type . "類(lèi)型");
}
}
else if(is_null($value) && $allow_null)
{
$this->fields[$key]["value"] = NULL;
}
}
}
else
{
throw new Exception("該屬性不存在");
}
}
}
通過(guò)定義一個(gè)一定格式的array可以比較方便地定義該字段的類(lèi)型、是否允許NULL值以及默認(rèn)值。
測(cè)試代碼如下:
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);
這里邊實(shí)現(xiàn)了getter以及setter,但由于時(shí)間關(guān)系我沒(méi)去實(shí)現(xiàn)readonly的功能,其實(shí)很簡(jiǎn)單,就是再加一項(xiàng),標(biāo)識(shí)它能不能被改寫(xiě)就成
php技術(shù):實(shí)現(xiàn)了一個(gè)PHP5的getter/setter基類(lèi)的代碼,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。