1.类和公有化
class
Computer {
//什么叫做类内,就是创建类的花括号内的范围叫做类内,其他地方则类外。
//public 是对字段的公有化,这个字段类外即可访问,赋值和取值
public
$name
=
'联想'
;
}
$computer
=
new
Computer();
$computer
-> name =
'Dell'
;
echo
$computer
->name;
2.访问私有字段
class
Computer {
private
$name
=
'联想'
;
//这个时候我采用一个公共对外的方法来访问私有字段
//因为私有字段只能在类内访问,而对外的公共方法是类内的。
//更而公共方法又是公共的,所以类外又可访问。
public
function
run(){
//字段在类内调用的时候必须是类 -> 字段,而$_name只是一个普通变量而已。
//字段在类外调用的方法是对象 -> 字段,而类内就必须使用 Computer -> _name
//但是在本类中,可以使用一个关键字来代替字来代替 Computer ,那就是 $this
echo
$this
->name;
}
}
$computer
=
new
Computer();
$computer
-> run();
3.私有字段访问 .不能直接对类内的私有字段赋值,不然会报错。如:$a =new Computer(); $a->name="baocuo";
class
Computer {
private
$name
;
private
$model
;
private
$cpu
;
private
$keyboard
;
private
$show
;
private
$zb
;
//必须写个对外的入口,才可以取到
public
function
getName() {
return
$this
->name;
}
//必须写一个对内的入口,对私有字段进行赋值
public
function
setName(
$name
) {
//这里的 $name 只是一个变量而已,参数而已
//$this->name 才是类的字段
$this
->name =
$name
;
}
}
$computer
=
new
Computer ();
echo
$computer
->getName(); //输出是空白的。
$computer
->setName(
'Dell'
);
echo
$computer
->getName();
4.私有字段,拦截器赋值和取值
//PHP有如下几个拦截器://1、__get($property)
//功能:访问未定义的属性时被调用在给不可访问属性赋值时
//2、__set($property, $value)
//功能:给未定义的属性设置赋值时被调用
//3、__isset($property)
//功能:对未定义的属性调用isset()时被调用
//4、__unset($property)
//功能:对未定义的属性调用unset()时被调用
//5、__call($method, $arg_array)
//功能:调用未定义的方法时被调用
//当类外的对象直接调用私有字段时,会报错。但可以先跟去检查是否有拦截器。如果直接对$name直接赋值,会先经过拦截器_set(),功能,未定义的属性被赋值时被调用。
__get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。
__set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。(key=>value)
class
Computer {
private
$_name
;
private
$_model
;
private
$_cpu
;
//当类外的对象直接调用私有字段时,会跟着去检查是否有拦截器,
//如果直接对 $_name 进行赋值,那么__set 方法就会拦截住,就不会报错了。
//采用拦截器进行赋值和取值
//赋值
private
function
__set(
$_key
,
$_value
){
//采用$_key = '_name',那么 $_value = '联想';
//$this ->_name = '联想';
$this
->
$_key
=
$_value
;
}
//取值
private
function
__get(
$_key
){
return
$this
->
$_key
;
//如果 $_key = '_name' 那么 $this -> _name;
//如果 $_key = '_cpu' 那么 $this -> _cpu;
//如果 $_key = '_model' 那么 $this -> _model;
}
}
$computer
=
new
Computer ();
$computer
->_name =
'联想'
;
$computer
->_cpu =
'四核'
;
$computer
->_model =
'i7'
;
echo
$computer
->_name;.//当我们调用对象$computer
未定义的属性_name
时,没有定义这个属性时或者属性是私有字段,调用拦截器__get()方法
echo
$computer
->_cpu;
echo
$computer
->_model;
5、static 静态
普通方法,存放类内,只有一份
静态方法,也是存放于类内,只有一份
区别在于:普通方法需要对象去调用,需要绑定$this
即,普通方法,必须要有对象,然后让对象来调用
而静态方法,不属于哪一个对象,因此不需要绑定$this
即,不需要对象也可以调用
静态属性不需要实例化就可以直接使用,在类还没有创建时就可以直接使用。
使用的方式是: 类名::静态属性名 exp: echo human::$head;
使用的方式是: 类名::静态属性名 exp: echo human::$head;
class
Human{
static
public
$head
=1;
public
function
easyeat(){
echo
'普通方法<br />'
;
}
static
public
function
eat(){
echo
'静态方法<br />'
;
}
public
function
intro(){
echo
$this
->name;
}
}
Human::eat();
/*
以下方法easyeat是一个非静态方法,就由对象来调用,但,用类来调用此方法来也可以执行,而严格状态下,此方法会执行,同时报错,
*/
Human::easyeat();
/*
接上,从逻辑来理解,如果用类名静态调用非静态(普通)方法
比如:intro()
那么,这个$this是指哪个对象呢??
因此会报错,因为找不到对象!
Human::intro();
/*
如上分析,其实,非静态方法,是不能由类名静态调用的,但目前,php中的面向对象检测不够严格,只要静态方法中没有$this关键字,就会转化成静态方法来处理!
*/
$li
=
new
Human();
$li
->eat();
/*
总结:
类》访问->静态方法(类的方法)->可以 Human::eat();
类》访问->普通方法(对象的方法)->不可以(虽然方法里不用$this关键字时,可以!但不支持这种写法)
对象》访问》静态方法(类的方法)->可以
$li
=
new
Human();
$li
->eat
();
对象》访问》普通方法(对象的方法)->可以
$li
=
new
Human();
$li
->easyeat
();
*/
class
Human{
static
public
$name
=
"小"
;
public
$height
= 180;
static
public
function
tell(){
echo
self::
$name
;
//静态方法调用静态属性,使用self关键词
//echo $this->height;//错。静态方法不能调用非静态属性
//因为 $this代表实例化对象,而这里是类,不知道 $this 代表哪个对象
}
public
function
say(){
echo
self::
$name
.
"我说话了"
;
//普通方法调用静态属性,同样使用self关键词
echo
$this
->height;
}
}
$p1
=
new
Human();
$p1
->say();
$p1
->tell();
//对象可以访问静态方法
echo
$p1
::
$name
;
//对象访问静态属性。不能这么访问$p1->name
//因为静态属性的内存位置不在对象里
Human::say();
//错。say()方法有$this时出错;没有$this时能出结果
//但php5.4以上会提示
(1)、静态属性不需要实例化即可调用。因为静态属性存放的位置是在类里,调用方法为"类名::属性名";
(2)、静态方法不需要实例化即可调用。同上
(3)、静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里;
(4)、静态方法可以调用非静态方法,使用 self 关键词。php里,一个方法被self:: 后,它就自动转变为静态方法;
(2)、静态方法不需要实例化即可调用。同上
(3)、静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里;
(4)、静态方法可以调用非静态方法,使用 self 关键词。php里,一个方法被self:: 后,它就自动转变为静态方法;
6.子类,父类
class
Computer {
public
$_name
=
'联想'
;
public
function
_run(){
echo
'联想在运行!'
;
}
}
class
NoteComputer
extends
Computer {
}
}
$noteComputer
=
new
NoteComputer();
echo
$noteComputer
-> _name;
$noteComputer
-> _run(); 直接继承
class Computer {
//私有化,但是无法被子类继承,这个时候就应该用受保护的修饰符来封装
protected $_name = '联想';
protected function _run(){
return '联想在运行!';
}
}
class NoteComputer extends Computer {
public function getTop() {//私有化继承父类
echo $this->_name;
echo $this->_run();
}
}
$noteComputer = new NoteComputer();
$noteComputer -> _run();
//私有化,但是无法被子类继承,这个时候就应该用受保护的修饰符来封装
protected $_name = '联想';
protected function _run(){
return '联想在运行!';
}
}
class NoteComputer extends Computer {
public function getTop() {//私有化继承父类
echo $this->_name;
echo $this->_run();
}
}
$noteComputer = new NoteComputer();
$noteComputer -> _run();