찾다
백엔드 개발PHP 튜토리얼php面向对象中构造 析构 封装性_PHP教程

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

Jul 13, 2016 pm 05:13 PM
cophp같은그리고기능이름성명물체캡슐화작동하다파괴하다~의을 위한

构造函数的声明与其它操作的声明一样,只是其名称必须是__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으로 문의하세요.
PHP 세션이 이미 시작되었는지 어떻게 확인할 수 있습니까?PHP 세션이 이미 시작되었는지 어떻게 확인할 수 있습니까?Apr 30, 2025 am 12:20 AM

PHP에서는 session_status () 또는 session_id ()를 사용하여 세션이 시작되었는지 확인할 수 있습니다. 1) session_status () 함수를 사용하십시오. php_session_active가 반환되면 세션이 시작되었습니다. 2) session_id () 함수를 사용하십시오. 비어 있지 않은 문자열이 반환되면 세션이 시작되었습니다. 두 방법 모두 세션 상태를 효과적으로 확인할 수 있으며 사용할 방법을 선택하면 PHP 버전 및 개인 선호도에 따라 다릅니다.

웹 응용 프로그램에서 세션을 사용하는 것이 필수적인 시나리오를 설명하십시오.웹 응용 프로그램에서 세션을 사용하는 것이 필수적인 시나리오를 설명하십시오.Apr 30, 2025 am 12:16 AM

SessionSareVitalInWebApplications, 특히 상수도가 포함되어 있습니다.

PHP에서 동시 세션 액세스를 어떻게 관리 할 수 ​​있습니까?PHP에서 동시 세션 액세스를 어떻게 관리 할 수 ​​있습니까?Apr 30, 2025 am 12:11 AM

PHP에서 동시 세션 액세스 관리 다음 방법으로 수행 할 수 있습니다. 1. 데이터베이스를 사용하여 세션 데이터를 저장하십시오. 이러한 방법은 데이터 일관성을 보장하고 동시성 성능을 향상시키는 데 도움이됩니다.

PHP 세션 사용의 한계는 무엇입니까?PHP 세션 사용의 한계는 무엇입니까?Apr 30, 2025 am 12:04 AM

phpsessionshaveseverallimitations : 1) StorageConstraintsCanleadToperFormanceIssues; 2) SecurityVulnerabilitiesSessionFixationAtCATACKSEXIST; 3) 확장 성분이 ANCHALLENGINGDUETOSERVERS-SCIFICSTORAGE; 4) SessionExpirationManagementCanbeproblematic; 5) Datapersis

로드 밸런싱이 세션 관리에 어떤 영향을 미치는지 설명하고 해결 방법을 설명하십시오.로드 밸런싱이 세션 관리에 어떤 영향을 미치는지 설명하고 해결 방법을 설명하십시오.Apr 29, 2025 am 12:42 AM

로드 밸런싱은 세션 관리에 영향을 미치지 만 세션 복제, 세션 끈적임 및 중앙 집중식 세션 스토리지로 해결할 수 있습니다. 1. 세션 복제 복사 서버 간의 세션 데이터. 2. 세션 끈은 사용자 요청을 동일한 서버로 안내합니다. 3. 중앙 집중식 세션 스토리지는 Redis와 같은 독립 서버를 사용하여 세션 데이터를 저장하여 데이터 공유를 보장합니다.

세션 잠금의 개념을 설명하십시오.세션 잠금의 개념을 설명하십시오.Apr 29, 2025 am 12:39 AM

SessionLockingIsateChniqueSureDureauser의 SessionLockingSsessionRemainSexclusivetoOneuseratatime.itiscrucialforpreptingdatacorruptionandsecurityBreachesInmulti-userApplications.sessionLockingSogingSompletEdusingserVerver-sidelockingMegynisms, unrasprantlockinj

PHP 세션에 대한 대안이 있습니까?PHP 세션에 대한 대안이 있습니까?Apr 29, 2025 am 12:36 AM

PHP 세션의 대안에는 쿠키, 토큰 기반 인증, 데이터베이스 기반 세션 및 Redis/Memcached가 포함됩니다. 1. Cookies는 클라이언트에 데이터를 저장하여 세션을 관리합니다. 이는 단순하지만 보안이 적습니다. 2. Token 기반 인증은 토큰을 사용하여 사용자를 확인합니다. 이는 매우 안전하지만 추가 논리가 필요합니다. 3. Database 기반 세션은 데이터베이스에 데이터를 저장하여 확장 성이 좋지만 성능에 영향을 줄 수 있습니다. 4. Redis/Memcached는 분산 캐시를 사용하여 성능 및 확장 성을 향상하지만 추가 일치가 필요합니다.

PHP의 맥락에서 '세션 납치'라는 용어를 정의하십시오.PHP의 맥락에서 '세션 납치'라는 용어를 정의하십시오.Apr 29, 2025 am 12:33 AM

SessionHijacking은 사용자의 SessionID를 얻음으로써 사용자를 가장하는 공격자를 말합니다. 예방 방법은 다음과 같습니다. 1) HTTPS를 사용한 의사 소통 암호화; 2) SessionID의 출처를 확인; 3) 보안 세션 생성 알고리즘 사용; 4) 정기적으로 SessionID를 업데이트합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.