php+项目的基类怎么写,实现了一个PHP5的getter/setter基类的代码_php技巧

这篇博客介绍了PHP5中如何通过定义数组来简化类的getter和setter方法的创建,同时提供了类型检查和默认值设置。作者通过创建一个抽象类`abstract_entity`,实现了根据数组定义的字段属性自动创建访问器,从而避免了大量重复的代码。文章还给出了一个测试用例,展示了如何使用这个抽象类来定义和操作类的属性。
摘要由CSDN通过智能技术生成

PHP3、PHP4都拥有类,但它们的类定义的实在很不像样,效率还挺难为情的,但资料上说PHP5重新构造了面向对象的支持,尽管并不是完全面向对象,但也算能拿出来见人了。

昨天晚上闲着无聊便弄起这玩意,感觉PHP5增加的类成员权限关键字挺好,但问题又来了,似乎还没一种方便的方式可以定义字段的getter以及setter,传统的方式是这样定义的:

class a

{

private $field;

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" => "",

"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("该属性不存在");

}

}

}

通过定义一个一定格式的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的功能,其实很简单,就是再加一项,标识它能不能被改写就成

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

相关文章

相关视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值