时间:2021-05-18
PHP3、PHP4都拥有类,但它们的类定义的实在很不像样,效率还挺难为情的,但资料上说PHP5重新构造了面向对象的支持,尽管并不是完全面向对象,但也算能拿出来见人了。
昨天晚上闲着无聊便弄起这玩意,感觉PHP5增加的类成员权限关键字挺好,但问题又来了,似乎还没一种方便的方式可以定义字段的getter以及setter,传统的方式是这样定义的:
classa
{
private$field;
publicfunctionget_field(){return$this->$field;}
publicfunctionset_field($value){$this->field=$value;}
}
虽然实现起来挺容易,但是说实在的,为一个字段去写这一堆代码还真不爽。。
于是便思索着是不是有一种更方便的方式来解决,并且可以方便地定义它的类型限制什么的。
捣鼓了半天(没办法,对它不熟。。),终于弄出一个类来解决这个问题:
classabstract_entity
{
private$fields;
private$sys_type=array(
"bool"=>"",
"array"=>"",
"double"=>"",
"float"=>"",
"int"=>"",
"integer"=>"",
"long"=>"",
"null"=>"",
"object"=>"",
"real"=>"",
"resource"=>"",
"string"=>""
//"mixed"and"number"
);
protectedfunction__construct($fields)
{
/*********************************\
*$fields=array(
*"id"=array(
*"allow_null"=false,
*"value"=1,
*"type"="int"
*);
*);
\**********************************/
$this->fields=$fields;
}
publicfunction__get($key)
{
if(array_key_exists($key,$this->fields))
{
return$this->fields[$key]["value"];
}
else
{
thrownewException("该属性不存在");
}
}
publicfunction__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',"returnis_$type($value);");
if(@$fun($value))
{
$this->fields[$key]["value"]=$value;
}
elseif($allow_null&&is_null($value))
{
$this->fields[$key]["value"]=NULL;
}
else
{
thrownewException("该值类型不正确,必须为".$type."类型");
}
}
elseif($type=="mixed")
{
if(!is_null($value))
{
$this->fields[$key]["value"]=$value;
}
elseif($allow_null)
{
$this->fields[$key]["value"]=NULL;
}
else
{
thrownewException("该值不允许为NULL值");
}
}
elseif($type=="number")
{
if(is_int($value)||is_float($value))
{
$this->fields[$key]["value"]=$value;
}
elseif(is_null($value)&&$allow_null)
{
$this->fields[$key]["value"]=NULL;
}
else
{
thrownewException("该值类型不正确,必须为".$type."类型");
}
}
else
{
if(class_exists($type)||interface_exists($type))
{
if(is_subclass_of($value,$type))
{
$this->fields[$key]["value"]=$value;
}
elseif(is_null($value)&&$allow_null)
{
$this->fields[$key]["value"]=NULL;
}
else
{
thrownewException("该值类型不正确,必须为".$type."类型");
}
}
elseif(is_null($value)&&$allow_null)
{
$this->fields[$key]["value"]=NULL;
}
}
}
else
{
thrownewException("该属性不存在");
}
}
}
通过定义一个一定格式的array可以比较方便地定义该字段的类型、是否允许NULL值以及默认值。
测试代码如下:
classtestextendsabstract_entity
{
publicfunction__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=newtest();
$a->id=123;
eche$a->id;
echo$a->ins1;
$a->ins1=NULL;
echois_null($a->ins1);
这里边实现了getter以及setter,但由于时间关系我没去实现readonly的功能,其实很简单,就是再加一项,标识它能不能被改写就成
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了Yii框架getter与setter方法功能与用法。分享给大家供大家参考,具体如下:1.属性在PHP中,类的成员变量也被称为属性。它们是类定义的一
在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可test.class.php复制代码代码如下:
jQuery的setter/getter共用一个函数,通过是否传参来表明它是何种意义。简单说传参它是setter,不传它是getter。一个函数具有多种意义在编
Getter是一种获取一个属性的值的方法,Setter是一种设置一个属性的值的方法。可以为任何预定义的核心对象或用户自定义对象定义getter和setter方法
遍历目录,结果存入数组。支持php4及以上。php5以后可用scandir()函数代替while循环。复制代码代码如下:另一个实现方法复制代码代码如下:func