首頁 後端開發 php教程 php面向对象中构造 析构 封装性_PHP教程

php面向对象中构造 析构 封装性_PHP教程

Jul 13, 2016 pm 05:13 PM
co php 一樣 函數 名稱 聲明 物件 封裝 操作 析構 面向

构造函数的声明与其它操作的声明一样,只是其名称必须是__construct( ),封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节

构造方法与析构方法
构造方法:
大多数类都有一种称为构造函数的特殊方法。当创建一个对象时,它将自动调用构造函数,也就是使用new这个关键字来实例化对象的时候自动调用构造方法。

构造函数的声明与其它操作的声明一样,只是其名称必须是__construct( )。这是PHP5中的变化,以前的版本中,构造函数的名称必须与类名相同,这种在PHP5中仍然可以用,但现在以经很少有人用了,这样做的好处是可以使构造函数独立于类名,当类名发生改变时不需要改相应的构造函数名称了。为了向下兼容,如果一个类中没有名为__construct( )的方法,PHP将搜索一个php4中的写法,与类名相同名的构造方法。

格式:function __construct ( [参数] ) { ... ... }

在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。比如对成属性在创建对象的时候赋初值。

 

 代码如下 复制代码

//创建一个人类  
class Person  
{  
    //下面是人的成员属性  
    var $name;  //人的名子  
    var $sex;    //人的性别  
    var $age;    //人的年龄  
 
    //定义一个构造方法参数为姓名$name、性别$sex和年龄$age  
    function __construct($name, $sex, $age)  
    {  
        //通过构造方法传进来的$name给成员属性$this->name赋初使值  
        $this->name=$name;  
        //通过构造方法传进来的$sex给成员属性$this->sex赋初使值  
        $this->sex=$sex;  
        //通过构造方法传进来的$age给成员属性$this->age赋初使值  
        $this->age=$age;  
    }  
 
    //这个人的说话方法  
    function say()  
    {  
        echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."";  
    }  
}  
 
//通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄  
$p1=new Person("张三","男", 20);  
$p2=new Person("李四","女", 30);  
$p3=new Person("王五","男", 40);  
 
//下面访问$p1对象中的说话方法  
$p1->say();  
//下面访问$p2对象中的说话方法  
$p2->say();  
//下面访问$p3对象中的说话方法  
$p3->say();  
 
输出结果为:  
我的名子叫:张三 性别:男 我的年龄是:20  
我的名子叫:李四 性别:女 我的年龄是:30  
我的名子叫:王五 性别:男 我的年龄是:40 

//创建一个人类
class Person
{
    //下面是人的成员属性
    var $name;  //人的名子
    var $sex;    //人的性别
    var $age;    //人的年龄

    //定义一个构造方法参数为姓名$name、性别$sex和年龄$age
    function __construct($name, $sex, $age)
    {
        //通过构造方法传进来的$name给成员属性$this->name赋初使值
        $this->name=$name;
        //通过构造方法传进来的$sex给成员属性$this->sex赋初使值
        $this->sex=$sex;
        //通过构造方法传进来的$age给成员属性$this->age赋初使值
        $this->age=$age;
    }

    //这个人的说话方法
    function say()
    {
        echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."";
    }
}

//通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄
$p1=new Person("张三","男", 20);
$p2=new Person("李四","女", 30);
$p3=new Person("王五","男", 40);

//下面访问$p1对象中的说话方法
$p1->say();
//下面访问$p2对象中的说话方法
$p2->say();
//下面访问$p3对象中的说话方法
$p3->say();

输出结果为:
我的名子叫:张三 性别:男 我的年龄是:20
我的名子叫:李四 性别:女 我的年龄是:30
我的名子叫:王五 性别:男 我的年龄是:40

析构函数:
与构造函数相对的就是析构函数。析构函数是PHP5新添加的内容,在PHP4中没有析构函数。析构函数允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件, 释放结果集等,析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行,也就是对象在内存中被销毁前调用析构函数。与构造函数的名称类似,一个类的析构函数名称必须是__destruct( )。析构函数不能带有任何参数。
格式:function __destruct ( ) { ... ... }

 

 代码如下 复制代码
//创建一个人类  
class Person  
{  
    //下面是人的成员属性  
    var $name;  //人的名子  
    var $sex;    //人的性别  
    var $age;    //人的年龄  
 
    //定义一个构造方法参数为姓名$name、性别$sex和年龄$age  
    function __construct($name, $sex, $age)  
    {  
        //通过构造方法传进来的$name给成员属性$this->name赋初使值  
        $this->name=$name;  
        //通过构造方法传进来的$sex给成员属性$this->sex赋初使值  
        $this->sex=$sex;  
        //通过构造方法传进来的$age给成员属性$this->age赋初使值  
        $this->age=$age;  
    }  
 
    //这个人的说话方法  
    function say()  
    {  
        echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."";  
    }         
 
    //这是一个析构函数,在对象销毁前调用  
    function __destruct()  
    {  
        echo "再见".$this->name."";  
    }  
}  
 
//通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄  
$p1=new Person("张三","男", 20);  
$p2=new Person("李四","女", 30);  
$p3=new Person("王五","男", 40);  
 
//下面访问$p1对象中的说话方法  
$p1->say();  
//下面访问$p2对象中的说话方法  
$p2->say();  
//下面访问$p3对象中的说话方法  
$p3->say();  
 
输出结果为:  
 
我的名子叫:张三 性别:男 我的年龄是:20  
我的名子叫:李四 性别:女 我的年龄是:30  
我的名子叫:王五 性别:男 我的年龄是:40  
 
再见张三  
再见李四  
再见王五 


封装性
封装性是面象对象编程中的三大特性之一,封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义:1.把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。2.信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界〔或者说形成一道屏障〕,只保留有限的对外接口使之与外部发生联系。

封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的"交叉感染",使软件错误能够局部化,大大减少查错和排错的难度。

用个实例来说明吧, 假如某个人的对象中有年龄和工资等属性,像这样个人隐私的属性是不想让其它人随意就能获得到的,如果你不使用封装,那么别人想知道就能得到,但是如果你封装上之后别人就没有办法获得封装的属性, 除非你自己把它说出去,否则别人没有办法得到。在比如说,个人电脑都有一个密码,不想让其它人随意的登陆,在你电脑里面拷贝和粘贴。还有就是像人这个对象, 身高和年龄的属性, 只能是自己来增涨,不可以让别人随意的赋值等等。

 

 代码如下 复制代码

//使用private这个关键字来对属性和方法进行封装:  
//原来的成员:  
var $name;          //声明人的姓名  
var $sex;           //声明人的性别  
var $age;           //声明人的年龄  
function run(){…….}  
 
//改成封装的形式:  
private $name;          //把人的姓名使用private关键字进行封装  
private $sex;           //把人的性别使用private关键字进行封装  
private $age;           //把人的年龄使用private关键字进行封装  
private function run(){……}  //把人的走路方法使用private关键字进行封装 

//使用private这个关键字来对属性和方法进行封装:
//原来的成员:
var $name;   //声明人的姓名
var $sex;   //声明人的性别
var $age;   //声明人的年龄
function run(){…….}

//改成封装的形式:
private $name;    //把人的姓名使用private关键字进行封装
private $sex;   //把人的性别使用private关键字进行封装
private $age;   //把人的年龄使用private关键字进行封装
private function run(){……} //把人的走路方法使用private关键字进行封装注意:只要是成员属性前面有其它的关键字就要去掉原有的关键字”var”. 通过private就可以把人的成员(成员属性和成员方法)封装上了。封装上的成员就不能被类外面直接访问了,只有对象内部自己可以访问;下面的代码会产生错误:


class Person  
{  
    //下面是人的成员属性  
    private $name;  //人的名子,被private封装上了  
    private $sex;    //人的性别, 被private封装上了  
    private $age;    //人的年龄, 被private封装上了  
 
    //这个人可以说话的方法  
    function say()  
    {  
        echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."";  
    }         
 
    //这个人可以走路的方法, 被private封装上了  
    private function run()  
    {  
        echo "这个人在走路";  
    }  
}  
//实例化一个人的实例对象  
$p1=new Person();  
 
//试图去给私有的属性赋值, 结果会发生错误  
$p1->name="张三";  
$p1->sex="男";  
$p1->age=20;  
 
//试图去打印私有的属性, 结果会发生错误  
echo $p1->name."";  
echo $p1->sex."";  
echo $p1->age."" 
 
//试图去打印私有的成员方法, 结果会发生错误  
$p1->run();  
 
输出结果为:  
Fatal error: Cannot access private property Person::$name 
Fatal error: Cannot access private property Person::$sex 
Fatal error: Cannot access private property Person::$age 
Fatal error: Cannot access private property Person::$name 
Fatal error: Call to private method Person::run() from context '' 

class Person
{
    //下面是人的成员属性
    private $name;  //人的名子,被private封装上了
    private $sex;    //人的性别, 被private封装上了
    private $age;    //人的年龄, 被private封装上了

    //这个人可以说话的方法
    function say()
    {
        echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."";
    }  

    //这个人可以走路的方法, 被private封装上了
    private function run()
    {
        echo "这个人在走路";
    }
}
//实例化一个人的实例对象
$p1=new Person();

//试图去给私有的属性赋值, 结果会发生错误
$p1->name="张三";
$p1->sex="男";
$p1->age=20;

//试图去打印私有的属性, 结果会发生错误
echo $p1->name."";
echo $p1->sex."";
echo $p1->age.""

//试图去打印私有的成员方法, 结果会发生错误
$p1->run();

输出结果为:
Fatal error: Cannot access private property Person::$name
Fatal error: Cannot access private property Person::$sex
Fatal error: Cannot access private property Person::$age
Fatal error: Cannot access private property Person::$name
Fatal error: Call to private method Person::run() from context ''

从上面的实例可以看到, 私有的成员是不能被外部访问的, 因为私有成员只能在本对象内部自己访问,比如,$p1这个对象自己想把他的私有属性说出去,在say()这个方法里面访问了私有属性,这样是可以。(没有加任何访问控制,默认的是public的,任何地方都可以访问)


//这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法  

 代码如下 复制代码

function say()  
{  
    echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age." 
";  
    //在这里也可以访问私有方法  
    //$this->run();  

//这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法
function say()
{
 echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."
";
 //在这里也可以访问私有方法
 //$this->run();
}因为成员方法say()是公有的, 所以我们在类的外部调用say()方法是可以的,改变上面的代码;


class Person  
{  
    //下面是人的成员属性  
    private $name;  //人的名子,被private封装上了  
    private $sex;    //人的性别, 被private封装上了  
    private $age;    //人的年龄, 被private封装上了  
 
    //定义一个构造方法参数为私有的属性姓名$name、性别$sex和年龄$age进行赋值  
    function __construct($name, $sex, $age)  
    {  
        //通过构造方法传进来的$name给私有成员属性$this->name赋初使值  
        $this->name=$name;  
        //通过构造方法传进来的$sex给私有成员属性$this->sex赋初使值  
        $this->sex=$sex;  
        //通过构造方法传进来的$age给私有成员属性$this->age赋初使值  
        $this->age=$age;  
    }  
 
    //这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法  
    function say()  
    {  
        echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age." 
";  
    }  
}  
 
//通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄  
$p1=new Person("张三","男", 20);  
$p2=new Person("李四","女", 30);  
$p3=new Person("王五","男", 40);  
 
//下面访问$p1对象中的说话方法  
$p1->say();  
//下面访问$p2对象中的说话方法  
$p2->say();  
//下面访问$p3对象中的说话方法  
$p3->say();  
 
输出结果为:  
我的名子叫:张三 性别:男 我的年龄是:20  
我的名子叫:李四 性别:女 我的年龄是:30  
我的名子叫:王五 性别:男 我的年龄是:40 

class Person
{
    //下面是人的成员属性
    private $name;  //人的名子,被private封装上了
    private $sex;    //人的性别, 被private封装上了
    private $age;    //人的年龄, 被private封装上了

    //定义一个构造方法参数为私有的属性姓名$name、性别$sex和年龄$age进行赋值
    function __construct($name, $sex, $age)
    {
        //通过构造方法传进来的$name给私有成员属性$this->name赋初使值
        $this->name=$name;
        //通过构造方法传进来的$sex给私有成员属性$this->sex赋初使值
        $this->sex=$sex;
        //通过构造方法传进来的$age给私有成员属性$this->age赋初使值
        $this->age=$age;
    }

    //这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法
    function say()
    {
        echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."
";
    }
}

//通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄
$p1=new Person("张三","男", 20);
$p2=new Person("李四","女", 30);
$p3=new Person("王五","男", 40);

//下面访问$p1对象中的说话方法
$p1->say();
//下面访问$p2对象中的说话方法
$p2->say();
//下面访问$p3对象中的说话方法
$p3->say();

输出结果为:
我的名子叫:张三 性别:男 我的年龄是:20
我的名子叫:李四 性别:女 我的年龄是:30
我的名子叫:王五 性别:男 我的年龄是:40因为构造方法是默认的公有方法(构造方法不要设置成私有的),所以在类的外面可以访问到,这样就可以使用构造方法创建对象, 另外构造方法也是类里面的函数,所以可以用构造方法给私有的属性赋初值。Say()的方法是默认公有的, 所以在外面也可以访问的到, 说出他自己的私有属性。

从上面的例子中我们可以看到, 私有的成员只能在类的内部使用, 不能被类外部直接来存取, 但是在类的内部是有权限访问的, 所以有时候我们需要在类的外面给私有属性赋值和读取出来,也就是给类的外部提供一些可以存取的接口,上例中构造方法就是一种赋值的形式, 但是构造方法只是在创建对象的时候赋值,如果我们已经有一个存在的对象了,想对这个存在的对象赋值, 这个时候,如果你还使用构造方法传值的形式传值, 那么就创建了一个新的对象,并不是这个已存在的对象了。所以我们要对私有的属性做一些可以被外部存取的接口,目的就是可以在对象存在的情况下,改变和存取属性的值,但要注意,只有需要让外部改变的属性才这样做,不想让外面访问的属性是不做这样的接口的,这样就能达到封装的目的,所有的功能都是对象自己来完成,给外面提供尽量少的操作。

如果给类外部提供接口,可以为私有属性在类外部提供设置方法和获取方法,来操作私有属性.例如:

 

 代码如下 复制代码

//私有的属性年龄  
prvate $age;  
 
//为外部提供一个公有设置年龄的方法  
function setAge($age)  
{  
    //在给属性赋值的时候,为了避免非法值设置给属性  
    if($age130)  
        return;  
    $this->age=$age;  
}  
 
//为外部提供一个公有获取年龄的方法  
function getAge()  
{  
    return($this->age);  

//私有的属性年龄
prvate $age;

//为外部提供一个公有设置年龄的方法
function setAge($age)
{
 //在给属性赋值的时候,为了避免非法值设置给属性
 if($age130)
  return;
 $this->age=$age;
}

//为外部提供一个公有获取年龄的方法
function getAge()
{
 return($this->age);
}上

面的方法是为一个成员属性设置和获取值, 当然你也可以为每个属性用同样的方法对其进行赋值和取值的操作,完成在类外部的存取工作。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/629193.htmlTechArticle构造函数的声明与其它操作的声明一样,只是其名称必须是__construct( ),封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可...
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

說明匹配表達式(PHP 8)及其與開關的不同。 說明匹配表達式(PHP 8)及其與開關的不同。 Apr 06, 2025 am 12:03 AM

在PHP8 中,match表達式是一種新的控制結構,用於根據表達式的值返回不同的結果。 1)它類似於switch語句,但返回值而非執行語句塊。 2)match表達式使用嚴格比較(===),提升了安全性。 3)它避免了switch語句中可能的break遺漏問題,增強了代碼的簡潔性和可讀性。

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

See all articles