类与对象:访问控制(可见性)

对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。 

属性的访问控制

类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。 

Example #1 属性声明

<?php

/**

 * Define MyClass

 */

class MyClass

{

    public $public = 'Public';

    protected $protected = 'Protected';

    private $private = 'Private';

    function printHello()

    {

        echo $this->public;

        echo $this->protected;

        echo $this->private;

    }

}

$obj = new MyClass();

echo $obj->public; // 这行能被正常执行

echo $obj->protected; // 这行会产生一个致命错误

echo $obj->private; // 这行也会产生一个致命错误

$obj->printHello(); // 输出 Public、Protected 和 Private

/**

 * Define MyClass2

 */

class MyClass2 extends MyClass

{

    // 可以对 public 和 protected 进行重定义,但 private 而不能

    protected $protected = 'Protected2';

    function printHello()

    {

        echo $this->public;

        echo $this->protected;

        echo $this->private;

    }

}

$obj2 = new MyClass2();

echo $obj2->public; // 这行能被正常执行

echo $obj2->private; // 未定义 private

echo $obj2->protected; // 这行会产生一个致命错误

$obj2->printHello(); // 输出 Public、Protected2 和 Undefined

?>  

Note: 为了兼容性考虑,在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 中仍然有效(只是作为 public 关键字的一个别名)。在 PHP 5.1.3 之前的版本,该语法会产生一个 E_STRICT 警告。  

方法的访问控制

类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。 

Example #2 方法声明

<?php

/**

 * Define MyClass

 */

class MyClass

{

    // 声明一个公有的构造函数

    public function __construct() { }

    // 声明一个公有的方法

    public function MyPublic() { }

    // 声明一个受保护的方法

    protected function MyProtected() { }

    // 声明一个私有的方法

    private function MyPrivate() { }

    // 此方法为公有

    function Foo()

    {

        $this->MyPublic();

        $this->MyProtected();

        $this->MyPrivate();

    }

}

$myclass = new MyClass;

$myclass->MyPublic(); // 这行能被正常执行

$myclass->MyProtected(); // 这行会产生一个致命错误

$myclass->MyPrivate(); // 这行会产生一个致命错误

$myclass->Foo(); // 公有,受保护,私有都可以执行

/**

 * Define MyClass2

 */

class MyClass2 extends MyClass

{

    // 此方法为公有

    function Foo2()

    {

        $this->MyPublic();

        $this->MyProtected();

        $this->MyPrivate(); // 这行会产生一个致命错误

    }

}

$myclass2 = new MyClass2;

$myclass2->MyPublic(); // 这行能被正常执行

$myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行

class Bar 

{

    public function test() {

        $this->testPrivate();

        $this->testPublic();

    }

    public function testPublic() {

        echo "Bar::testPublic\n";

    }

    private function testPrivate() {

        echo "Bar::testPrivate\n";

    }

}

class Foo extends Bar 

{

    public function testPublic() {

        echo "Foo::testPublic\n";

    }

    private function testPrivate() {

        echo "Foo::testPrivate\n";

    }

}

$myFoo = new foo();

$myFoo->test(); // Bar::testPrivate 

                // Foo::testPublic

?>  

其它对象的访问控制

同一个类的对象即使不是同一个实例也可以互相访问对方的私有与受保护成员。这是由于在这些对象的内部具体实现的细节都是已知的。 

Example #3 访问同一个对象类型的私有成员

<?php

class Test

{

    private $foo;

    public function __construct($foo)

    {

        $this->foo = $foo;

    }

    private function bar()

    {

        echo 'Accessed the private method.';

    }

    public function baz(Test $other)

    {

        // We can change the private property:

        $other->foo = 'hello';

        var_dump($other->foo);

        // We can also call the private method:

        $other->bar();

    }

}

$test = new Test('test');

$test->baz(new Test('other'));

?>  

以上例程会输出:

string(5) "hello"

Accessed the private method.

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

php编程基础教程.pptx|php编程培训,php,编程,基础,教程,pptx
php编程基础教程.pptx

历史上的今天:04月28日

referrer策略和meta标签的问题

referrer策略和meta标签的问题请求后端接口时,banner图片的请求出现403错误:GEThttp://xxxxxxxxxxxx403(Forbidden)。在网上搜寻一番,解决方法如下:在index.html中的head中添加&lt;meta name=&quot;referrer&quot; content=&quot;no-referrer&quot; /&gt;。在此之前,关于r

热门专题

中源管业|中源管业,中源管业公司,中源管业有限公司,中源管业电话,中源管业地址,中源管业电力管,中源管业mpp电力管,中源管业cpvc电力管,中源管业pe穿线管
中源管业
云南综合高中|云南综合高中
云南综合高中
云南开放大学|云南开放大学报名,云南开放大学报考,云南开放大学,什么是云南开放大学,云南开放大学学历,云南开放大学学费,云南开放大学报名条件,云南开放大学报名时间,云南开放大学学历,云南开放大学专业
云南开放大学
安徽中源管业|安徽中源管业,安徽中源管业mpp电力管,安徽中源管业cpvc电力管,安徽中源管业pe穿线管,安徽中源管业电力管,安徽中源管业排水管,安徽中源管业通信管,安徽中源管业管材
安徽中源管业
金诺幼儿园(春城路金诺幼儿园)|昆明官渡区幼儿园,幼儿园报名,官渡区幼儿园,春城路幼儿园,幼儿园招生,学前班,昆明幼儿园,金诺幼儿园,环城南路幼儿园,石井路幼儿园
金诺幼儿园(春城路金诺幼儿园)
云南巨榕教育投资集团有限公司|云南巨榕教育投资集团有限公司,巨榕教育集团,巨榕教育
云南巨榕教育投资集团有限公司
弥勒综合高中|弥勒综合高中
弥勒综合高中
云南网站建设|云南网站制作,网站建设,云南网站开发,云南网站设计,云南网页设计,云南网站建设公司,云南网站建设
云南网站建设

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部