已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP > 教程

标题: PHP面向对象教程(二):实例化的对象

作者: @Ta

时间: 2011-11-30

点击: 3003

占位,思考中…
    上一篇教程中,我们认识了类、类的静态属性(变量)和静态方法(函数)。我们知道了,静态的东西都要加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,'之墓';
}
}

.全文完.

[隐藏样式|查看源码]


『回复列表(3|隐藏机器人聊天)』

1. 老虎会游泳
(/@Ta/2011-11-30 11:49//)

2. 谢老虎出了这么好的教程
(/@Ta/2011-11-30 12:28//)

3. 总算把类弄会了…
(/@Ta/2011-11-30 17:30//)

回复需要登录

9月18日 16:44 星期四

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1