日志

PHP类的访问控制

PHP的类属性、方法的可见性通过三个关键词来定义,即public、protected和private

  • 关键词

  1. public

    类成员(方法、属性)可以随处访问;
    以var声明的类属性会被定义为public性质;
    为了兼容PHP4,如果没有指定访问控制,属性和方法默认为公有的;

  2. protected

    类成员可以被自身、继承类和父类访问。(注意:类实例对象不可访问)

  3. private

    类成员只允许自身访问

  • 例子

PHP version: PHP5.5

<?php
class obj{
    public $obj_pub = 'obj_pub';
    protected $obj_protected = 'obj_protected';
    private $obj_private = 'obj_private';

    public function print_data(){
        echo $this->obj_private;
	echo $this->obj_protected;
	echo $this->obj_private;
    }

    protected function method_protected(){}

    private function method_private(){}
}

$o = new obj();
echo $o->obj_pub;//公有属性调用
echo $o->obj_protected; //报错,实例对象不可访问受保护的类属性
echo $o->obj_private; //报错,实例对象不可访问私有属性
echo $o->print_data();//调用公有方法

class animal extends obj{
    
    public function print_1(){
	echo $this->obj_pub;//调用父类公有属性
	echo $this->obj_protected;//调用父类受保护的属性
    }

    public function print_2(){
	echo $this->obj_privatje;//报错,父类私有属性禁止子类访问
    }

    public function foo(){
	$this->print_data();//调用父类公有方法
	$this->method_protected();//调用父类受保护的方法
	$this->method_private();//报错,父类私有方法禁止子类访问
    }
}

$a = new animal();
$a->print_1();
$a->print_2();
$a->foo();
转载请注明出处:

© http://hejunhao.me

日志

PHP的__construct和__destruct

__construct

__construct是PHP的构造函数,在对象创建时首先被调用,如果子类没有定义构造函数则会从父类继承其构造函数(非私有时),如果子类已经定义了构造函数则不会隐式调用父类的构造函数,子类可以通过parent::__construct(..)的方式调用父类构造函数.构造函数主要在对象创建时进行必要的初始化工作.

特别地,子类的构造函数的参数不需要与父类的构造函数一致,即覆盖时不会报E_STRICT错误

如果子类没有定义__construct(),也没有从父类继承,那么会尝试寻找旧式构造函数(与类同名的函数)(注意:从PHP5.3.3起,在命名空间中,与类同名的方法不再作为构造函数

__destruct

__destruct是PHP的析构函数,在对象被删除或隐式销毁时被调用. (since PHP5)

例子

<?php
class obj{
    public $name = '';
	
    function __construct($name){
	echo 'obj_construct call' . PHP_EOL;
	$this->name = $name;
    }

    function __toString(){
	return $this->name . PHP_EOL;
    }

    function __destruct(){
	echo 'obj_destruct call' . PHP_EOL;
    }
}

class animal extends obj{
    public $name = '';
    public $height = '';
	
    function __construct($name, $height){
	parent::__construct($name);
	echo 'animal_construct call' . PHP_EOL;
	$this->name = $name;
	$this->height = $height;
    }

    function __toString(){
	return $this->name . ': ' . $this->height . PHP_EOL;
    }
}

class dog extends animal{

    function __destruct(){
	echo 'dog_destruct call'.PHP_EOL;
    }
}

$d = new dog('dog','90cm');
echo $d;
unset($d);
echo '--------分割线-----' . PHP_EOL;
$a = new animal('animal', '100cm');
echo $a;
unset($a);

/********输出********

obj_construct call
animal_construct call
dog: 90cm
dog_destruct call
--------分割线-----
obj_construct call
animal_construct call
animal: 100cm
obj_destruct call

*********************/
日志

PHP中this、self和parent的区别

this

this是指向类实例化对象的指针,因此它指向的不是类而是类实例化后的对象,例如 $obj = new Animal(); 此时类内部定义的$this指的就是$obj这个对象,而不是Animal这个类.

self

self是类自身的引用,通常指向类的静态成员常量,在类体内引用静态成员和常量时不能用$this->var / $this->foo() 的形式.

parent

parent是指向父类的引用,通过parent可以访问父类方法(不管是否为静态)、父类静态成员父类常量,但不可以访问父类的非静态属性.(注意:$this也可以调用父类方法,但是如果继承类覆盖了父类方法A,那么$this->A()指的是继承类的A()方法,而parent::A()指的依然是父类的A()方法,不受覆盖影响

例子

<?php
class Object{
    public $name = '';
	
    public function __construct($name){
	$this->name = $name;
    }

    protected function foo(){
	echo 'Object foo function'.PHP_EOL;
    }
}

class Animal extends Object{
    public static $count = 0;
    const OBJECT_ID = 999;

    public function __construct($name){
	parent::__construct($name);
	self::count();
	parent::foo();
	$this->foo();
    }

    protected function foo(){
	echo 'Animal foo function'.PHP_EOL;
    }

    private static function count(){
	self::$count += 1;
    }
}

$a = new Animal('dog');
echo $a->name;
echo PHP_EOL;
echo Animal::$count;
echo PHP_EOL;
echo Animal::OBJECT_ID;
echo PHP_EOL;

$c = new Animal('cat');
echo $c->name;
echo PHP_EOL;
echo Animal::$count;
echo PHP_EOL;
echo Animal::OBJECT_ID;

/*****Output*****
 
Object foo function
Animal foo function
dog
1
999
Object foo function
Animal foo function
cat
2
999

*******************/
转载请注明出处:

© http://hejunhao.me