實(shí)現(xiàn)了一個(gè)PHP5的getter/setter基類的代碼
更新時(shí)間:2007年02月25日 00:00:00 作者:
PHP3、PHP4都擁有類,但它們的類定義的實(shí)在很不像樣,效率還挺難為情的,但資料上說PHP5重新構(gòu)造了面向?qū)ο蟮闹С?,盡管并不是完全面向?qū)ο?,但也算能拿出來見人了?
昨天晚上閑著無(wú)聊便弄起這玩意,感覺PHP5增加的類成員權(quán)限關(guān)鍵字挺好,但問題又來了,似乎還沒一種方便的方式可以定義字段的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)起來挺容易,但是說實(shí)在的,為一個(gè)字段去寫這一堆代碼還真不爽。。
于是便思索著是不是有一種更方便的方式來解決,并且可以方便地定義它的類型限制什么的。
搗鼓了半天(沒辦法,對(duì)它不熟。。),終于弄出一個(gè)類來解決這個(gè)問題:
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("該屬性不存在");
}
}
}
通過定義一個(gè)一定格式的array可以比較方便地定義該字段的類型、是否允許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)系我沒去實(shí)現(xiàn)readonly的功能,其實(shí)很簡(jiǎn)單,就是再加一項(xiàng),標(biāo)識(shí)它能不能被改寫就成
昨天晚上閑著無(wú)聊便弄起這玩意,感覺PHP5增加的類成員權(quán)限關(guān)鍵字挺好,但問題又來了,似乎還沒一種方便的方式可以定義字段的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)起來挺容易,但是說實(shí)在的,為一個(gè)字段去寫這一堆代碼還真不爽。。
于是便思索著是不是有一種更方便的方式來解決,并且可以方便地定義它的類型限制什么的。
搗鼓了半天(沒辦法,對(duì)它不熟。。),終于弄出一個(gè)類來解決這個(gè)問題:
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("該屬性不存在");
}
}
}
通過定義一個(gè)一定格式的array可以比較方便地定義該字段的類型、是否允許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)系我沒去實(shí)現(xiàn)readonly的功能,其實(shí)很簡(jiǎn)單,就是再加一項(xiàng),標(biāo)識(shí)它能不能被改寫就成
您可能感興趣的文章:
- 關(guān)于__defineGetter__ 和__defineSetter__的說明
- 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超大文件下載,斷點(diǎn)續(xù)傳下載的方法詳解
本篇文章是對(duì)PHP超大文件下載,斷點(diǎn)續(xù)傳下載的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP結(jié)合jQuery實(shí)現(xiàn)找回密碼
本文將使用PHP+Mysql+jQuery來實(shí)現(xiàn)一個(gè)密碼找回的功能,分享給大家思路和具體的代碼,有需要的小伙伴可以參考下。2015-07-07PHP MVC模式在網(wǎng)站架構(gòu)中的實(shí)現(xiàn)分析
MVC模式在網(wǎng)站架構(gòu)中十分常見。它允許我們建立一個(gè)三層結(jié)構(gòu)的應(yīng)用程式,從代碼中分離出有用的層,幫助設(shè)計(jì)師和開發(fā)者協(xié)同工作以及提高我們維護(hù)和擴(kuò)展既有程式的能力。2010-03-03使用PHP獲取網(wǎng)絡(luò)文件的實(shí)現(xiàn)代碼
PHP獲取網(wǎng)絡(luò)文件的實(shí)現(xiàn)代碼,其實(shí)就是一個(gè)小偷程序。學(xué)習(xí)php小偷程序的朋友可以參考下。2010-01-01理解PHP5中static和const關(guān)鍵字的區(qū)別
理解PHP5中static和const關(guān)鍵字的區(qū)別...2007-03-03php實(shí)現(xiàn)的農(nóng)歷算法實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的農(nóng)歷算法,較為詳細(xì)的分析了農(nóng)歷算法的原理與php實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-08-08利用swoole+redis實(shí)現(xiàn)股票和區(qū)塊鏈服務(wù)
這篇文章主要給大家介紹了關(guān)于利用swoole+redis實(shí)現(xiàn)股票和區(qū)塊鏈服務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)下吧。2017-09-09