實(shí)現(xiàn)了一個(gè)PHP5的getter/setter基類(lèi)的代碼
更新時(shí)間:2007年02月25日 00:00:00 作者:
PHP3、PHP4都擁有類(lèi),但它們的類(lèi)定義的實(shí)在很不像樣,效率還挺難為情的,但資料上說(shuō)PHP5重新構(gòu)造了面向?qū)ο蟮闹С?,盡管并不是完全面向?qū)ο?,但也算能拿出?lái)見(jiàn)人了。
昨天晚上閑著無(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ě)就成
昨天晚上閑著無(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ě)就成
您可能感興趣的文章:
- 關(guān)于__defineGetter__ 和__defineSetter__的說(shuō)明
- JavaScript之Getters和Setters 平臺(tái)支持等詳細(xì)介紹
- javascript中的__defineGetter__和__defineSetter__介紹
- ECMAScript5中的對(duì)象存取器屬性:getter和setter介紹
- JavaScript中setter和getter方法介紹
- jQuery 3.0 的 setter和getter 模式詳解
- 使用node+vue.js實(shí)現(xiàn)SPA應(yīng)用
- 基于Vue.js的表格分頁(yè)組件
- Vue.js每天必學(xué)之組件與組件間的通信
- 談?wù)勔騐ue.js引發(fā)關(guān)于getter和setter的思考
相關(guān)文章
php在linux下檢測(cè)mysql同步狀態(tài)的方法
這篇文章主要介紹了php在linux下檢測(cè)mysql同步狀態(tài)的方法,是Linux下使用php檢測(cè)mysql同步狀態(tài)的實(shí)用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01
PHP中獲取內(nèi)網(wǎng)用戶MAC地址(WINDOWS/linux)的實(shí)現(xiàn)代碼
做一個(gè)內(nèi)網(wǎng)根據(jù)MAC地址自動(dòng)登錄的應(yīng)用,在WINDOW 2003可以正常使用,函數(shù)如下2011-08-08
php無(wú)限分類(lèi)使用concat如何實(shí)現(xiàn)
這篇文章主要介紹了php無(wú)限分類(lèi)使用concat是如何實(shí)現(xiàn)的,需要的朋友可以參考下2015-11-11
WordPress網(wǎng)站訪問(wèn)慢解決方案細(xì)圖文教程
這篇文章主要介紹了WordPress網(wǎng)站訪問(wèn)慢解決方案細(xì)圖文教程,wordpress訪問(wèn)慢一直是一個(gè)比較頭疼的問(wèn)題,有正好需要的同學(xué)可以嘗試下,感覺(jué)不錯(cuò)的可以分享給大家2021-03-03
php set_magic_quotes_runtime() 函數(shù)過(guò)時(shí)解決方法
PHP5.3中 bool set_magic_quotes_runtime ( bool $new_setting )函數(shù)過(guò)時(shí).2010-07-07
在PHP中養(yǎng)成7個(gè)面向?qū)ο蟮暮昧?xí)慣
如果您尚未打算用 OO 原則創(chuàng)建應(yīng)用程序,則使用 PHP 的面向?qū)ο螅∣O)的語(yǔ)言特性,這 7 個(gè)習(xí)慣將幫助您開(kāi)始在過(guò)程編程與 OO 編程之間進(jìn)行轉(zhuǎn)換。2010-07-07
PHP取整函數(shù):ceil,floor,round,intval的區(qū)別詳細(xì)解析
以下是對(duì)PHP中的取整函數(shù):ceil,floor,round,intval的區(qū)別進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08

