PHP_面向对象小记

来源:互联网 发布:剑灵捏脸数据怎么用 编辑:程序博客网 时间:2024/05/22 14:33

//这个是php的新的特性,对于从C++也有类似的可以返回私有属性的函数

接触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搞定。

 

//---------------------------------------------------------------------------------

注意php是弱类语言。他不需要事先定义变量的类型也不须事先声明才可以用。
所以$this->b=12 相当于你var $b=12。然后直接调用像你写的 $this->b;

静态函数的引用必须用self::$a1;
如果是在类外面用就:echo(Abc::$a1);
静态函数是这个类的函数,而不是属于单个对象实例的函数。既然不是实例,那个$this指向谁? 所以说经态函数里是不能用$this的

首先我们要明确一点,self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。
我们看,上面的类分别在11行和20行使用了this指针,那么当时this是指向谁呢?其实this是在实例化的时候来确定指向谁,比如第一次实例化对象的时候(25行),那么当时this就是指向$nameObject对象,那么执行18行的打印的时候就把print( $this-><name )变成了print( $nameObject->name ),那么当然就输出了"heiyeluren"。第二个实例的时候,print( $this->name )变成了print( $nameObject2->name ),于是就输出了"PHP5"。所以说,this就是指向当前对象实例的指针,不指向任何其他对象或类

我们知道parent是指向父类的指针,一般我们使用parent来调用父类的构造函数

我 们注意这么几个细节:成员属性都是public的,特别是父类的,是为了供继承类通过this来访问。我们注意关键的地方,
第25行: parent::__construct( "heiyeluren" ),这时候我们就使用parent来调用父类的构造函数进行对父类的初始化,因为父类的成员都是public的,于是我们就能够在继承类中直接使用 this来调用。

 

原创粉丝点击