执行方法和成员变量决定了设计Class的作用。本节介绍如何在PHP中编写执行方法和成员变量,以及在其他Class中可以编写哪些内容。
现在让我们来设计课程的内容。一个Class不仅要有成员变量来存储值,还要有执行方法来描述这个Class。
成员变量用于保存Class内的值。例如,如果您设计了一个代表电视的Class,您可能想记住您当前正在观看的电视频道。成员变量的描述方法如下。
class Class名{
public 成员变量;
}
访问修饰符附加在成员变量名的前面,共有三种,在这我们首先用public.
例如,设计一个电视类并定义一个成员变量来记住当前频道,如下所示:
class Television{
public $channelNo;
}
执行方法然后以方法的形式描述你希望设计的Class做什么。比如换台了。执行方法的写法如下。
class Class名{
public 成员变量;
function 执行方法名(){
// 在Class中执行
}
}
例如,让我们定义一个方法来显示 TV 类中的当前频道。
class Television{
public $channelNo;
function dispChannel(){
print('现在的频道是'.$this->channelNo);
}
}
一个简单的Class就作好了。
现在我们已经完成了Class的设计,让我们实际使用它。首先,创建一个“Television”Class的对象。
$tv = new Television();
class Television{
public $channelNo;
function dispChannel(){
print('现在的频道是'.$this->channelNo);
}
}
接下来,让我们将号码设置为频道。要使用从类创建的对象访问成员变量,请执行以下操作。
$对象名->成员变量名;
在前面的示例中,它看起来像这样:
$tv = new Television();
$tv->channelNo = 12;
class Television{
public $channelNo;
function dispChannel(){
print('现在的频道是'.$this->channelNo);
}
}
要访问类内的成员变量,使用“this”,写法如下。
$this->成员变量名;
接下来,让我们显示当前频道。要使用从类创建的对象访问成员方法,请执行以下操作。
$对象名->执行方法名();
在前面的示例中,它看起来像这样:
$tv = new Television();
$tv->channelNo = 12;
$tv->dispChannel();
class Television(){
public $channelNo;
function dispChannel(){
print('现在的频道是'.$this->channelNo);
}
}
示例代码
现在让我们试试看
<html>
<head><title>PHP TEST</title></head>
<body>
<?php
$tv = new Television();
$tv->channelNo = 12;
$tv->dispChannel();
class Television{
public $channelNo;
function dispChannel(){
print('现在的频道是'.$this->channelNo);
}
}
?>
</body>
</html>
如果将上述文件安装在WWW服务器上,通过浏览器查看,将显示如下。
Class的执行方法也可以接受参数。在那种情况下,语法将是:
class Class名{
public 成员变量名;
function 执行方法名(参数1, 参数2, ...){
// 在Class中的程序处理
}
}
在方法名称后的括号中,写入要作为参数接收的变量。如果您有多个,请将它们用逗号 (,) 分隔并排书写。
例如,让我们定义一个设置新频道的方法。
class Television{
public $channelNo;
function dispChannel(){
print('现在的频道是'.$this->channelNo);
}
function setChannel($channel){
$this->channelNo = $channel;
$this->dispChannel();
}
}
上面,在“setChannel”方法中,将作为参数传递的值设置到一个成员变量中,调用同一个Class中的“dispChannel”方法来显示频道。
调用类内的成员方法,使用“this”,写法如下。
$this->执行方法();
而从对象调用方法时,在括号中写上你想传递给方法的值,然后调用方法。
$tv = new Television();
$tv->setChannel(5);
class Television(){
public $channelNo;
function dispChannel(){
print('现在的频道是'.$this->channelNo);
}
function setChannel($channel){
$this->channelNo = $channel;
$this->dispChannel();
}
}
示例代码
现在让我们试试看
<html>
<head><title>PHP TEST</title></head>
<body>
<?php
$tv = new Television();
$tv->setChannel(5);
class Television{
public $channelNo;
function dispChannel(){
print('当前频道是'.$this->channelNo);
}
function setChannel($channel){
$this->channelNo = $channel;
$this->dispChannel();
}
}
?>
</body>
</html>
如果将上述文件安装在WWW服务器上,通过浏览器查看,将显示如下。
访问修饰符是指,允许访问成员变量和方法的位置。指定以下三个选项之一:「public」「private」「protected」
首先,让我们看一下指定成员变量三种方法。
class Test{
public 成员变量名;
private 成员变量名;
protected 成员变量名;
}
如上所示,您可以通过在成员变量前加上访问修饰符来指定成员变量的可访问范围。
以下是每个访问修饰符的访问权限:
public 可从Class内或Class外的任何地方
private 仅可从同一CLass内
protected 可从同一Class和子Class进行访问
“Protected”与Class继承有关,这里重点说说“public”和“private”。
一是“public”。“public”基本上不限制访问,所以Class内和Class外都允许访问。具体来说,正如我们目前在示例中看到的那样,可以从Class中的方法内部进行引用,从Class中创建对象,并从对象中获取或更改成员变量的值。
$tv = new Television();
$tv->channelNo = 9;
$tv->setChannel(5);
class Television(){
public $channelNo;
function setChannel($channel){
$this->channelNo = $channel;
$this->dispChannel();
}
}
另一方面,如果您指定“private”,您可以在同一个Class中访问它,但您将无法从Class外访问它。换句话说,不可能从Class创建对象并通过该对象检查成员变量的值。
示例代码
让我们在示例中将成员变量的访问修饰符更改为“private”并尝试一下。
<html>
<head><title>PHP TEST</title></head>
<body>
<?php
$tv = new Television();
$tv->channelNo = 5;
$tv->dispChannel();
class Television{
private $channelNo;
function dispChannel(){
print('当前频道是'.$this->channelNo);
}
}
?>
</body>
</html>
如果将上述文件安装到 WWW 服务器上并通过浏览器查看,屏幕上将不会显示任何内容,并且以下内容将输出到 WWW 服务器的错误日志中。
[Thu Jun 22 02:41:18 2006] [error] [client 127.0.0.1] PHP 致命错误:无法访问 D:\\Apache
Group\\Apache2\\htdocs\\sample\
中的私有财产 Television::$channelNo \classtest3.php 在第 8 行
发生错误是因为您试图通过从Class创建的对象访问“私有”成员变量。当您想限制来自Class以外的访问时,请使用“私有”。
将访问修饰符应用于成员方法
您可以用相同的方式为成员方法指定访问修饰符。与前面示例的情况一样,如果未指定访问修饰符,则假定为“public”。另一方面,如果您指定“private”,则只允许从Class内访问(只允许从Class内的其他方法内访问)。
添加访问修饰符时,写在代表方法的“函数”之前。
class Test{
public function 执行方法名(){
}
private function 执行方法名(){
}
protected function 执行方法名(){
}
}
例如,按如下方式使用它。
$tv = new Television();
$tv->setChannel(5);
class Television{
private $channelNo;
private function dispChannel(){
print('当前频道是'.$this->channelNo);
}
public function setChannel($channel){
$this->channelNo = $channel;
$this->dispChannel();
}
}
在上面,我在“dispChannel”方法之前添加了“private”。“dispChannel”方法是从同一个Class中的“setChannel”方法调用的,这很好,因为它在同一个Class中。但是,不再可能直接从对象调用“dispChannel”。
这样,访问修饰符就可以用来保护本应只在Class内部可见的信息,或者明确不需要从外部直接调用的方法是不能调用的。这使得以后通过查看源代码更容易防止不正确的使用并理解变量和方法的用途。
我们再详细解释一下如何使用访问修饰符访问成员变量。
第一种是当成员变量设置为 public 时。如果公开,则可以从外部自由更改变量的值,因此具有灵活性,但变量的值可以以非预期的方式重写,或者可以自由设置原本无法设置的值.
例如,即使您希望只能为电视频道设置 1 到 12 之间的数字,如果您可以直接从外部设置成员变量的值,则可以设置意外的数字,例如 20 或 30。您可以设置值。
$tv = new Television();
$tv->channelNo = 20;
class Television(){
public $channelNo;
function setChannel($channel){
$this->channelNo = $channel;
}
}
因此,成员变量被设置为private,成员变量只能通过成员方法来改变。通过方法设置,可以预先检查值的范围,从而消除设置不合适值的风险。
$tv = new Television();
$tv->setChannelNo(20);
class Television(){
public $channelNo;
function setChannel($channel){
if (($channel >= 1) and ($channel <= 12)){
$this->channelNo = $channel;
}
}
}
如果您是自己开发一个小程序,您可能不必担心,但如果您创建一个通用类并重复使用该类进行编程,那么防止意外使用也很重要。
另外,由于是私有的,所以不能直接引用成员变量的值。因此,可以通过单独定义一个可以获取成员变量值的方法来获取成员变量的值。
$tv = new Television();
$tv->setChannelNo(20);
print('当前频道是'.$tv->getChannel());
class Television(){
public $channelNo;
function setChannel($channel){
if (($channel >= 1) and ($channel <= 12)){
$this->channelNo = $channel;
}
}
function getChannel(){
return $this->channelNo;
}
}
如上所述,当您想从成员方法中返回一个值给调用者时,使用“return”。
class Class名{
public 成员变量名;
function 执行方法名(参数1, 参数2, ...){
// 再CLASS内部处理
return 値;
}
}
示例代码
现在让我们试试看。
<html>
<head><title>PHP TEST</title></head>
<body>
<?php
$tv = new Television();
$tv->setChannel(20);
print('当前频道是'.$tv->getChannel().'<br>');//②
$tv->setChannel(10);
print('当前频道是'.$tv->getChannel().'<br>');//③
class Television{
private $channelNo = 8;
function setChannel($channel){
if (($channel >= 1) and ($channel <= 12)){
$this->channelNo = $channel;
}else{
print('请设置频道在1到12之间<br>');//①
}
}
function getChannel(){
return $this->channelNo;
}
}
?>
</body>
</html>
如果将上述文件安装在WWW服务器上,通过浏览器查看,将显示如下。
您可以在类中定义常量。常量必须是固定值。语法如下。
class Class名(){
const 常量名称 = 値;
}
要在 PHP 中定义常量,请使用“define”,但在类中定义时,请在“const”之后指定常量的名称并定义值。请注意,常量名称不像变量那样以“$”标记开头。
此外,要从类中引用此常量的值,请将其描述为“self::常量名称”。
class Class名(){
const 定数名 = 値;
function Method名(){
print(self::常量名);
}
}
※”self” 代表当前Class。“$this”是针对每个对象的,但是“self”是作为一个Class来思考的。这是因为常量是按Class设置的,而不是按对象设置的。
示例代码
现在让我们试试看。下面是使用常量重写的上一页示例。
<html>
<head><title>PHP TEST</title></head>
<body>
<?php
$tv = new Television();
$tv->setChannel(20);
print('当前频道是'.$tv->getChannel().'<br>');//②
$tv->setChannel(10);
print('当前频道是'.$tv->getChannel().'<br>');//③
class Television{
private $channelNo = 8;
const MAX_CHANNEL = 12;
const MIX_CHANNEL = 1;
const ERROR_MSG = '请将通道设置在 1 和 12 之间<br>';
function setChannel($channel){
if (($channel >= self::MIX_CHANNEL) and
($channel <= self::MAX_CHANNEL)){
$this->channelNo = $channel;
}else{
print(self::ERROR_MSG);//①
}
}
function getChannel(){
return $this->channelNo;
}
}
?>
</body>
</html>
如果将上述文件安装在WWW服务器上,通过浏览器查看,将显示如下。
构造函数是一种在使用 new 从类创建对象时自动调用的方法。如果在创建对象时需要进行初始化处理,写在构造函数中就会自动执行。
编写构造函数时,语法如下。
class Class名(){
function __construct(变量1, 变量2, ...){
// 构造函数中处理
}
}
如果将方法名称替换为“__construct”,它将成为构造函数。
考虑使用和不使用构造函数。首先,如果不使用构造函数,有初始化处理的话,会像下面这样。
$tv = new Television();
$tv->init(8);
class Television{
private $channelNo;
function init($channel){
$this->channelNo = $channel;
}
}
上面定义了初始化处理的方法“init”,创建对象后调用一次。但是,在这种格式下,如果忘记调用“init”方法,类中的成员变量将保持未初始化状态,从而导致意外错误。
使用构造函数时:
$tv = new Television();
class Television{
private $channelNo;
function __construct($channel){
$this->channelNo = $channel;
}
}
这次使用构造函数来描述初始化过程,因此当从此类创建对象时会调用一次构造函数,因此可以可靠地执行初始化。通过这样使用构造器,不会忘记初始化过程,作为创建对象时只调用一次的方法,可以明确意图。
参数也可以在构造函数中指定,但似乎无法定义参数有无和参数个数不同的多个构造函数。因此,每个类只能定义一个构造函数。
示例代码
现在让我们试试看。
<html>
<head><title>PHP TEST</title></head>
<body>
<?php
$tv1 = new Television();
print('当前频道是'.$tv1->getChannel().'<br>');
class Television{
private $channelNo;
function __construct(){
$this->channelNo = 8;
}
function getChannel(){
return $this->channelNo;
}
}
?>
</body>
</html>
如果将上述文件安装在WWW服务器上,通过浏览器查看,将显示如下。