ホームページ >php教程 >php手册 >PHP5 ゲッター/セッター基本クラスを実装するコード

PHP5 ゲッター/セッター基本クラスを実装するコード

WBOY
WBOYオリジナル
2016-06-13 12:33:30794ブラウズ

PHP3もPHP4もクラスはありますが、そのクラス定義は本当にまともではなく、その効率はかなり恥ずかしいですが、データによると、PHP5はオブジェクト指向のサポートを再構築しました。完全なオブジェクト指向ではありませんが、使用できます。誰かに会いましょう。
昨日の夜、暇だったときにこれを始めました。PHP5 で追加されたクラスメンバー許可キーワードは非常に優れていると感じていますが、問題は再び発生します。getter と setter を定義する便利な方法がないようです。従来の方法は次のように定義されます。

{
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" => " "、
"配列" => ""、
"倍精度浮動小数点" => ""、
"整数" => 、
"整数" => ""、
"null" => ""、
"オブジェクト" => 🎜 > "real" => "",
"resource" => "",
"string" => ""
// "mixed" と "number"
) ;
保護された関数 __construct($fields)
{
/**********************************
* $fields = array(
* "id" = array(
* 「allow_null」 = false、
* 「値」 = 1、
* 「タイプ」 = 「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))
"] = $value;

else if($allow_null && is_null($value))
{
$this->fields[$key]["value"] = NULL;

else
{
throw new Exception("该值类型がありません、必须ため" . $type . "类型");

else if($type == "mixed")

if(!is_nu ll($value))
{
$this->フィールド[$key]["value"] = $value;

else if($allow_null)
{
$this->fields[$key]["value"] = NULL;

else
{
throw new Exception("该值不允许はNULL值");

else if($type == "number")

if(is_int($値) || is_float($value))
{
$this->fields[$key]["value"] = $value;

else if(is_null($value) && $allow_null)

$this-> ;フィールド[$key]["値"] = 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("该属性不存在") ;
}
}
}

は、1 つの動作形式の配列を指定することによって、そのフィールドの種類、NULL 値を許可するかどうか、および監査値を簡単に比較できます。

测试代码如下:

class test extends abstract_entity
{
public function __construct()
{

$define = array(
"id" => array(
"allow_null" => false,
"value" => 1,
"type" => "int"
)、
"名前" => array(
"allow_null" => false,
"値" => "abc",
"タイプ" => "文字列"
)、 )、
"ins" => array(
"allow_null" => false,
"value" => $this,
「タイプ」 => 「テスト」
)、

"ins1" => array(
"allow_null" => true,
"value" => $this,
「タイプ」 =>「テスト」
)、
"ins2" => array(
「allow_null」 => true,
「値」 => NULL,
「タイプ」 => 「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 を完了しましたが、時間の経過により読み取り専用の機能が廃止されたため、その機能は再追加され、标识它能は変更できません

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。