标题: PHP面向对象教程(二):实例化的对象
作者: 老虎会游泳 @Ta
时间: 2011-11-30
占位,思考中…
上一篇教程中,我们认识了类、类的静态属性(变量)和静态方法(函数)。我们知道了,静态的东西都要加static关键字。
那么,如果去掉static会怎样呢?我们来试试吧:
<?php
class cat
{
$name;
function born($name)
{self::$name=$name;}
function getname()
{return self::$name;}
}
cat::born('加菲');
echo '大家好,我是', cat::getname();
?>
执行,parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION on line 4
呃,看来直接写个$name;是不行的。在类中定义变量时前面必须要写定义关键字。如果你没什么特殊需求,可以写成
public $name;
或者
var $name;
//php5不推荐第二种写法
定义关键字还有private(私有)和protected(受保护),它们和public(公开)是相对的,不能同时出现(但是这三个都可以与static同时出现)。这些定义关键字可以加在属性($var)或方法(function name)前面。
如果你把一个类方法定义成private static function name(),在类外面你将不能用“类名::name()”调用这个方法,因为它是私有方法,只能在类的内部被调用。private static $name定义的属性也禁止外部访问。用这种方法可以防止外部错误地修改类的数据而导致错误。
protected和private相似,但略有不同,具体情况在下一篇(类的继承)中说。
下面回到测试中,我们修改$name;一行为public $name;之后,发现仍然出错:
Fatal error Access to undeclared Static property: cat::$name on line 7(致命错误:第七行有一个未定义的静态属性)
呵呵,不能用self::$name访问非静态属性的!我们得用$this->name(注意不是$this->$name!$this->$name虽然可能不报错,但它得不到正确的结果)
第七行改为 $this->name=$name; 之后,再次运行,依然报错:
Fatal error: Using $this when not in object(致命错误,不能在对象外面使用$this)
(注意:第13行的self::$name也要改成$this->name,我忘了说)
那么,怎么在对象里使用$this呢?似乎我们之前一直在说类,根本没提到对象。现在我们就来创建一个对象吧:
$mycat=new cat;
我们使用new关键字创建一个对象,并把对象与$mycat变量绑定,这个过程就是标题中说的“实例化”。非静态的属性和方法,只有在实例化之后才能使用:
$mycat->born('加菲');
echo $mycat->name;
echo $mycat->getname();
与静态类比起来,实例化成对象有什么优势呢?看:
$cat1=new cat;
$cat2=new cat;
$cat3=new cat;
通过一个类实例化出了三只猫!
只是,我要给三只猫起名,却不得不一个一个地调用born方法,很麻烦啊。有什么方法可以在new的时候就给猫起名呢?嗯,PHP5中有一个“构造方法”:
function __construct($name)
{
$this->name=$name;
}
用这个方法代替born方法之后:
$newcat=new cat('斑虎');
//现在我们的猫已经叫“斑虎”了,不信?
echo $newcat->getname();
总结一下:PHP5中,名为__construct的函数(构造函数)会在对象实例化时被调用,并接受实例化时传来的参数。与之相对的是析构函数(__destruct),它会在对象被销毁时调用(不带任何参数)。
注:unset($newcat);或者$newcat=null;等操作都可以销毁对象。如果未手动销毁,php会在程序结束后销毁。
注2:__是两条下划线,少了多了都不管用的哦。
class cat
{
public $name;
function __construct($name)
{
echo '喵~~我是',$name;
$this->name=$name;
}
function __destruct()
{
echo $this->name,'之墓';
}
}
.全文完.
[隐藏样式|查看源码]