攔截器使用,攔截器檢查到私有字段,則不會報錯,如果沒有攔截器會直接報錯。
<?php
class Computer{
private $_name;
private $_model;
private $_cpu;
//當類外對象調(diào)用私有字段時,會去檢查是否有攔截器,如果有不會報錯,沒則報錯,__set和__get是攔截器。
//直接對$_name進行賦值,那么__set方法就會攔截住,就不會報錯了。
public function __set($_key, $_value)
{
//那么$key='_name',那么$value='聯(lián)想'
//$this->_name = '聯(lián)想'
$this -> $_key = $_value;
}
public function __get($_key)
{
return $this->$_key;
}
}
$computer = new Computer();
$computer->_name='聯(lián)想';
$computer->_model='i7';
$computer->_cpu='四核';
echo $computer->_name;
echo $computer->_model;
echo $computer->_cpu;
PHP5.3以后不支持方法私有,這點要注意。
<?php
class Computer{
const NAME = 'DELL';
}
echo Computer::NAME;
常量使用有個概念需要知道,常量是運行在數(shù)據(jù)區(qū)上的,跟變量和類運行在堆棧內(nèi)存不一樣,數(shù)據(jù)區(qū)運行數(shù)據(jù)往往是疊加的,而堆棧區(qū)運行當有多個對象,數(shù)據(jù)并不是疊加的。
<?php
class Computer{
public $_count = 0;
public function _add(){
$this->_count++;
}
}
$computer1 = new Computer();
$computer1->_add();
$computer1->_add();
$computer1->_add();
echo $computer1->_count;
$computer2 = new Computer();
$computer2->_add();
$computer2->_add();
$computer2->_add();
echo $computer2->_count;//最后輸出結(jié)果是3 3
<?php
class Computer{
public static $_count = 0;
public function _add(){
//如果是靜態(tài)成員字段,要用self來調(diào)用,而不是$this
self::$_count++;
}
}
$computer1 = new Computer();
$computer1->_add();echo Computer::$_count;
$computer1->_add();echo Computer::$_count;
$computer1->_add();
echo Computer::$_count;
$computer2 = new Computer();
$computer2->_add();echo Computer::$_count;
$computer2->_add();echo Computer::$_count;
$computer2->_add();
echo Computer::$_count;
最后輸出結(jié)果是3,6 我特意每條打印發(fā)現(xiàn)是123456,證明是疊加上去的,以下例子除了成員字段靜態(tài)化,連方法也靜態(tài)化也是一樣的。
<?php
class Computer{
public static $_count = 0;
public static function _run(){
self::$_count++;
}
}
//當方法,成員字段都是靜態(tài)時,不需要實例化就能直接調(diào)用
Computer::_run();
Computer::_run();
Computer::_run();
echo Computer::$_count;