面向对象特性:
*重用性 (每个模块都可以在项目中重复使用)
*灵活性 (每个模块都很轻松被替换更改的)
*拓展性(在模块上添加新功能是很方便的)
类和对象的关系(类生成对象)
物以类聚:相同特性的对象归为一个类,比如nba球员,都有想到的属性姓名,身高体重,球队号码,方法有跑步,跳跃,运球,投篮。将他们当做一个类,而乔丹,詹姆斯这些就是nba球员的实例,也叫对象;
对象内部高内聚(特定的职能,所有相关的内容都封装在对象内部),对外低耦合(对象的一些可见属性和一些可见方法)
用class 声明一个类,在类里面只能有 成员属性 和 成员方法!!!!不能有其他,在一个脚本中不能有两个同名类,实例化类可以有多个对象
class Computer{ public $text = "用关键字new实例化一个类"; public function output(){ echo $this->text; } } $computer = new Computer(); $computer->output();//外部访问方法
$computer->text();//外部访问属性
$computer2 = new Computer();//可以实例化多个
类的属性和方法
访问控制:
public 公有 都可以访问
private 私有 只有类本身内部可以访问
protected 受保护 继承的子类和类本身内部可以访问,外部访问不了,如: $computer->output();如果output()方法设了protected,则报错。
类里面的方法:
方法里面调用一个属性,需要实例化类才能访问属性,而$this可以理解为是这个类的一个实例
class Computer{ public $text = "用$this调用我"; public function output(){ echo $this->text; } }
构造方法(实例化时执行)
构造方法可以传递参数,在实例化时传入
通过构造函数的参数传递,改变里面的属性使得每个实例对象不同
class Computer{ function __construct($arg){ echo "我是构造方法,自动执行";
echo $arg;
} }
$conputer = new Computer("我是构方法的参数");
析构方法:销毁时执行,不能有参数
程序结束后自动执行,手动释放(当对象的引用全部销毁时)会使析构函数提前执行,不用等到程序结束后才调用
当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了
//对象引用 在PHP 中引用的意思是:不同的名字访问同一个变量内容. class A { function __destruct() { echo '====我是析构函数===='; } } $a = new A(); //提前执行析构函数的两个方法 unset($a);$a=null; echo "====正常执行我是先输出的====="; //两种对象引种的区别 $a = $b;//这时$a和$b是两个独立的引用,unset($aa)只是删除了$a的引用,还有$b的引用,所以不会执行析构函数。改变其中一个为null,不会影响另外一个变量,也不会执行析构函数; $c = &$a;//两个的变量使用同个引用,c是a的影子,改变其中一个变量为null,两个都为null,会执行析构函数。但是只是unset($a),$c还在使用引用,只要有引用在不会执行析构函数;
//对象的引用用于访问对象的属性和方法,所以$a $b $c都可以访问对象的属性方法; //当一个对象的所有引用被删除后,才会触发析构函数 //总结:如果程序大,对象引用尽量使用&,节省内存,清除也方便。设其中一个为Null,其他都为Null; //变量引用 (默认变量赋值会独立开辟一个内存存放内容) //PHP 的引用允许你用两个变量来指向同一个内容 $a="AB"; $b =&$a; echo $a;//这里输出:AB echo $b;//这里输出:AB $b="EF"; echo $a;//这里$a的值变为EF 所以输出EF echo $b;//这里输出EF<?php
$a
= 1;
$b
=
$a
;
echo
$a
;
//在此之前,b都是和a共用内存空间的。
xdebug_debug_zval(
'b'
);
$a
= 2;
//a作出了改变,此时b才会有自己的空间
xdebug_debug_zval(
'b'
);
?>
//函数引用 <?php function test(&$a){ $a=$a+100; } $b=1; echo $b;//输出1 test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了 echo "<br>"; echo $b;//输出101 ?>
//函数的引用返回
<?php
function &test(){
static $b=0;//申明一个静态变量
$b=$b+1;
echo $b;
return $b;
}
$a=test();//这条语句会输出 $b的值 为1 相当于$a=$b
$a=5; $a=test();//这条语句会输出 $b的值 为2 也是$a=$b
$a=&test();//这条语句会输出 $b的值 为3 $a=&$b,所以b会随a变了
$a=5; $a=test();//这条语句会输出 $b的值 为6
?>
赋值和克隆的区别:
$a=$b(独立引用)和$a=&$b(同一引用)这种赋值方式,指向的是同一个对象,同一块内存空间;
$a=clone $b这种赋值方式,则是指向另一个新的对象,另一个块新的内存空间。
<?php class mm { public $name = 'Peter'; } $a = new mm(); $b = $a; $c = &$a; $d = clone $a; $b->name = "Anne"; echo $a->name,"\n",$b->name,"\n",$c->name,"\n",$d->name;//输出为:Anne Anne Anne Peter ?>