一、1、 public:所有类都能调用
protected: 被其自身定义的类和子类、父类可以调用
private:只能被其自身定义的类调用
2、 类属性必须被定义为public(公有)、protected(受保护)、private(私有)之一。
类方法没有设置,默认为public。
如果用var定义,则被视为公有。
class Phone{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello(){
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$phone = new Phone();
echo $phone->public; //输出Public
echo $phone->protected; //报错,无法访问受保护的属性
echo $phone->private; //报错,无法访问私有的属性
$phone->printHello(); //输出Public Protected Private
class Phone2 extends Phone{
protected $protected = 'Protected2';
function printHelle(){
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$phone2 = new Phone2();
echo $phone2->public; //输出Public
echo $phone2->protected; //报错,无法访问被保护的属性
echo $phone2->private; //未定义当前private值,报错
$phone2->printHelle();//输出Public Protected2 Undefined property
class Phone{
//声明一个公有的构造函数
public function __construct(){}
//声明一个公有的方法
public function phonePublic(){}
//声明一个受保护的方法
protected function phoneProtected(){}
//声明一个私有的方法
private function phonePrivate(){}
未声明访问控制,默认为public公有
function Foo(){
$this->phonePublic();
$this->phoneProtected();
$this->phonePrivate();
}
}
$phone = new Phone();
$phone->phonePublic(); //正常运行
$phone->phoneProtected(); //产生一个致命错误
$phone->phonePrivate(); //产生一个致命错误
$phone->Foo(); //正常运行
class PhoneTwo extends Phone{
function Foo2(){
$this->phonePublic();
$this->phoneProtected();
$this->phonePrivate();//会产生一个致命错误
}
}
$phone2 = new PhonTwo();
$phone2->phonePublic();
$phone2->phoneProtected();
$phone2->phonePrivate();
$phone2->Foo2();//公有和受保护可以执行,私有不能执行
3、访问同一个对象类型的私有成员:同一个类的对象即使不是同一个实例也可以互相访问对方的私有与受保护成员
class Phone{
private $phone;
public function __construct($phone){
$this->phone = $phone;
}
private function name(){
echo '访问私有方法';
}
public function testName(Phone $other){
//改变私有属性值
$other->phone = 'iPhone';
var_dump($other->phone);
//调用私有方法
$other->name();
}
}
$phone = new Phone();
$phone->testName(new Phone('other'));
输出:
string(5) "iPhone"
"访问私有方法"
4、构造方法如果定义成了私有,就不允许实例化,一般通过静态方法实例化对象。
比如单例模式只允许有一个全局唯一的对象。
class Phone {
private static $name = null;
private static function __construct(){
echo '手机实例化';
}
public static function getInstance(){
if(empty(selft::$name)){
//静态属性可以调用本类私有方法,因为私有方法只有本类可以调用,
//只有调用构造函数才可以实例化对象
self::$name = new Phone();
}else{
return self::$name;
}
}
}
$phone = new Phone();//无法实例化(因为构造函数私有,不能在其他类别调用)
$phone = Phone::getInstance();//静态方法获得一个对象