__get和__set 方法的使用
PHP5之_set和_get函数
接触PHP5也有一段时间了,尽管PHP5出了很长时间了,但大家对PHP5还是不甚感冒。在我的BLOG里讲一天PHP5的东西,希望能够对推动PHP5有所贡献。
先来看一个例子:
class UserInfo{
var $UserName = ’’;
var $PassWord = ’’;
var $Birthday = ’’;
}
这个例子我想很多人在PHP4种也有用到,接下来给对象属性进行付值:
$oUserInfo = new UserInfo;
$oUserInfo->UserName = '木目';
$oUserInfo->PassWord = '123456';
$oUserInfo->Birthday = '1978-08-16';
$oUserInfo->age = 27;
echo "用户名:".$oUserInfo->UserName."<br/>\n";
echo "密 码:".$oUserInfo->PassWord."<br/>\n";
echo "生 日:".$oUserInfo->Birthday."<br/>\n";
上 面的代码在PHP4、PHP5种运行起来并不会发生任何问题。然而实际使用中我并不希望给对象没有定义的属性进行付之操作,我希望的是编程的人员能够严格 按照我所设计的结构进行,这个时候在PHP4中就无能为力了。如果你正在试用PHP5,那我告诉你一个好消息,这个问题在PHP5中的有了较好的解决,虽 然并不完美。那就是__set和__get我们来利用PHP5的一些特性改写一下上面的代码看看会发生什么问题:
class UserInfo1{
var $UserName = ’’;
var $PassWord = ’’;
var $Birthday = ’’;
function __set($property,$value){
echo "对不起,你要设置的属性({$property}=>{$value})不存在<br>";
}
function __get($property){
echo "对不起,你要获取的属性({$property})不存在<br>";
}
}
$oUserInfo1 = new UserInfo1;
$oUserInfo1->UserName = '木目子';
$oUserInfo1->PassWord = '123456';
$oUserInfo1->Birthday = '1978-08-16';
$oUserInfo1->age = 27;
echo "用户名:".$oUserInfo1->UserName."<br/>\n";
echo "密 码:".$oUserInfo1->PassWord."<br/>\n";
echo "生 日:".$oUserInfo1->Birthday."<br/>\n";
运行一下看看会发生什么,仔细想想就不难发现__set和__get的作用了。但让__set和__get的用途远远不止这些,这只是一个很简单的例子。
class UserInfo2{
private $aData = array();
}
$oUserInfo2 = new UserInfo2;
$oUserInfo2->aData['UserName'] = '木目子';
$oUserInfo2->aData['PassWord'] = '123456';
$oUserInfo2->aData['Birthdat'] = '1978-08-16';
echo "用户名:".$oUserInfo2->aData['UserName'] ."<br/>\n";
echo "密 码:".$oUserInfo2->aData['PassWord'] ."<br/>\n";
echo "生 日:".$oUserInfo2->aData['Birthday'] ."<br/>\n";
显然,这段代码会出错的,因为aData是UserInfo的私有属性,不能直接在外部使用,那现在问题是必须要给aData进行付值,这个时候__set和__get就排上用场了:
class UserInfo3{
//private $aData = array();
private $aData = array();
function __set($property,$value){
$this->aData[$property] = $value;
}
function __get($property){
return $this->aData[$property];
}
}
$oUserInfo3 = new UserInfo3;
$oUserInfo3->aData['UserName'] = '木目子';
$oUserInfo3->aData['PassWord'] = '123456';
$oUserInfo3->aData['Birthdat'] = '1978-08-16';
echo "用户名:".$oUserInfo3->aData['UserName'] ."<br/>\n";
echo "密 码:".$oUserInfo3->aData['PassWord'] ."<br/>\n";
echo "生 日:".$oUserInfo3->aData['Birthday'] ."<br/>\n";
再来运行一下看看,OK一些搞定。
PHP5 新增的东西还是很多,在此,旨在通过这两个方法的介绍,希望能给大家一些启示。所谓手册、书籍能够交给的你的东西仅仅只是一些基本的用法而已,更多的技 巧、设计思想等,还需你在平时的工作不断积累、思考、沉淀,正所谓“师傅领进门,修行在个人”,学习最重要的还是在自己。
先来看一个例子:
class UserInfo{
var $UserName = ’’;
var $PassWord = ’’;
var $Birthday = ’’;
}
这个例子我想很多人在PHP4种也有用到,接下来给对象属性进行付值:
$oUserInfo = new UserInfo;
$oUserInfo->UserName = '木目';
$oUserInfo->PassWord = '123456';
$oUserInfo->Birthday = '1978-08-16';
$oUserInfo->age = 27;
echo "用户名:".$oUserInfo->UserName."<br/>\n";
echo "密 码:".$oUserInfo->PassWord."<br/>\n";
echo "生 日:".$oUserInfo->Birthday."<br/>\n";
上 面的代码在PHP4、PHP5种运行起来并不会发生任何问题。然而实际使用中我并不希望给对象没有定义的属性进行付之操作,我希望的是编程的人员能够严格 按照我所设计的结构进行,这个时候在PHP4中就无能为力了。如果你正在试用PHP5,那我告诉你一个好消息,这个问题在PHP5中的有了较好的解决,虽 然并不完美。那就是__set和__get我们来利用PHP5的一些特性改写一下上面的代码看看会发生什么问题:
class UserInfo1{
var $UserName = ’’;
var $PassWord = ’’;
var $Birthday = ’’;
function __set($property,$value){
echo "对不起,你要设置的属性({$property}=>{$value})不存在<br>";
}
function __get($property){
echo "对不起,你要获取的属性({$property})不存在<br>";
}
}
$oUserInfo1 = new UserInfo1;
$oUserInfo1->UserName = '木目子';
$oUserInfo1->PassWord = '123456';
$oUserInfo1->Birthday = '1978-08-16';
$oUserInfo1->age = 27;
echo "用户名:".$oUserInfo1->UserName."<br/>\n";
echo "密 码:".$oUserInfo1->PassWord."<br/>\n";
echo "生 日:".$oUserInfo1->Birthday."<br/>\n";
运行一下看看会发生什么,仔细想想就不难发现__set和__get的作用了。但让__set和__get的用途远远不止这些,这只是一个很简单的例子。
class UserInfo2{
private $aData = array();
}
$oUserInfo2 = new UserInfo2;
$oUserInfo2->aData['UserName'] = '木目子';
$oUserInfo2->aData['PassWord'] = '123456';
$oUserInfo2->aData['Birthdat'] = '1978-08-16';
echo "用户名:".$oUserInfo2->aData['UserName'] ."<br/>\n";
echo "密 码:".$oUserInfo2->aData['PassWord'] ."<br/>\n";
echo "生 日:".$oUserInfo2->aData['Birthday'] ."<br/>\n";
显然,这段代码会出错的,因为aData是UserInfo的私有属性,不能直接在外部使用,那现在问题是必须要给aData进行付值,这个时候__set和__get就排上用场了:
class UserInfo3{
//private $aData = array();
private $aData = array();
function __set($property,$value){
$this->aData[$property] = $value;
}
function __get($property){
return $this->aData[$property];
}
}
$oUserInfo3 = new UserInfo3;
$oUserInfo3->aData['UserName'] = '木目子';
$oUserInfo3->aData['PassWord'] = '123456';
$oUserInfo3->aData['Birthdat'] = '1978-08-16';
echo "用户名:".$oUserInfo3->aData['UserName'] ."<br/>\n";
echo "密 码:".$oUserInfo3->aData['PassWord'] ."<br/>\n";
echo "生 日:".$oUserInfo3->aData['Birthday'] ."<br/>\n";
再来运行一下看看,OK一些搞定。
PHP5 新增的东西还是很多,在此,旨在通过这两个方法的介绍,希望能给大家一些启示。所谓手册、书籍能够交给的你的东西仅仅只是一些基本的用法而已,更多的技 巧、设计思想等,还需你在平时的工作不断积累、思考、沉淀,正所谓“师傅领进门,修行在个人”,学习最重要的还是在自己。