PHP新手之学习类与对象

Posted 孤舟残月浅笑嫣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP新手之学习类与对象相关的知识,希望对你有一定的参考价值。

四、访问控制

对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。

1、对类成员的访问控制

类成员都必须使用关键字public、protected 或 private 进行定义

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 $obj -> public; // 这行能被正常执行
echo $obj2 -> private; // 未定义 private
echo $obj2 -> protected; // 这行会产生一个致命错误
$obj2 -> printHello(); // 输出 Public、Protected2,但不会输出 Private

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
?>

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

2、对方法的访问控制

类中的方法都必须使用关键字public、protected 或 private 进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。

Example#2 声明类中的方法

<?php
/**
 * Define MyClass
 */
class MyClass {
    // 构造函数必须是 public
    public function __construct() {
    } 
    // 声明一个 public 的方法
    public function MyPublic() {
    } 
    // 声明一个 protected 的方法
    protected function MyProtected() {
    } 
    // 声明一个 private 的方法
    private function MyPrivate() {
    } 
    // 这个方法也是 public 的
    function Foo() {
        $this -> MyPublic();
        $this -> MyProtected();
        $this -> MyPrivate();
    } 
} 

$myclass = new MyClass;
$myclass -> MyPublic(); // 这行能被正常执行
$myclass -> MyProtected(); // 这行会产生一个致命错误
$myclass -> MyPrivate(); // 这行会产生一个致命错误
$myclass -> Foo(); // Public、Protected 和 Private 都被调用了

/**
 * Define MyClass2
 */
class MyClass2 extends MyClass {
    // This is public
    function Foo2() {
        $this -> MyPublic();
        $this -> MyProtected();
        $this -> MyPrivate(); // 这行会产生一个致命错误
    } 
} 

$myclass2 = new MyClass2;
$myclass2 -> MyPublic(); // 这行能被正常执行
$myclass2 -> Foo2(); // Public 和 Protected 都被调用了,但 Private 不会被调用

?>

 

以上是关于PHP新手之学习类与对象的主要内容,如果未能解决你的问题,请参考以下文章

PHP新手之学习类与对象

PHP新手之学习类与对象

PHP面向对象之解释器模式

设计思想与模式之四静态代理模式

新手学Python之学习官网教程(四: More Control Flow Tools)

Java新手入门200例116之Java反射访问构造方法