2018-3-5 面向对象
今天学习了有关“面向对象”的内容:
传统的面向对象:把将要完成的工作,一个步骤一个步骤的实现,最终完成目标。
现代的面向对象:把要做的事情提前存起来,等到需要用的时候调用,相当于设计方法和方法的调用。
面向对象主要是设计思想上的极大提升。面向过程是解决简单问题的自然的思维过程,面向对象是解决大规模的复杂问题的良好思想。
面向对象的基本概念:
类:表示一个群体。有“共同特征”,某一类事物的总称。
对象:表示群体中的个体,万事万物皆为对象。
1、定义类:
定义类的语法中,包括定义属性、定义方法、定义常量三种。
2、创建类的对象:
3、使用对象:
//定义类
class c1{ var $name="匿名"; var $sex="未知"; var $age=18; function f1(){ echo "函数f1被调用!"; } const pi=3.14; }
//创建类的对象 $person1=new c1(); $person2=new c1(); $person1->name="张三"; $person1->sex="男"; $str1=$person1->name; echo "{$str1}的性别为:".$person1->sex."<br />"; $person1->f1();
创建对象的基本形式:
①$对象名1=new 类名();
②可变类名:
$CName="C1"; $person3=new $CName(); //可变类(名)
③$对象名3 = new self; //self指代类本身,这行代码只能在类内部方法中使用。
④通过对象创建对象
$person4=new $person3; //通过对象创建该类的新对象
对象的传值:
php中,传值方式有值传递和引用传递。
值传递:拷贝数据本身。传递结束,有两份数据,但两变量“相互独立”。
引用传递:传递结束,数据只有一份,两个变量同时指向该数据。
面向对象:默认值传递,可以引用传递。
class p{ var $v1=10; } $p1=new p(); $p2=$p1->v1; $p1->v1=20; var_dump($p1); var_dump($p2);
输出结果为:$p1=20
$p2=10
class p{ var $v1=10; } $p1=new p(); $p2=$p1; //传的是v1,不是v1的值 $p1->v1=20; var_dump($p1); var_dump($p2);
输出结果为:$p1=20
$p2=20
class p{ var $v1=10; } $p1=new p(); $p2=&$p1->v1; $p1->v1=20; var_dump($p1); var_dump($p2);
输出结果为:$p1=20
$p2=20
面向对象的方法:
例:
//斜边 class person{ var $x=1; var $y=1; var $pi=1; function getxiebian($a,$b){ $s1=$a*$a+$b*$b; $s2=pow($s1,0.5); return $s2; } } $p1=new person(); $xie1=$p1->getxiebian(3,4); echo "<br />斜边1=$xie1";
$this关键字:
$this是一个“伪对象”,代表当前所属类的当前对象。
//类与对象的创建 “自我介绍” class Person{ public $name="匿名"; public $age=28; public $PI=3.14; function intro(){ echo"<b/>hi,大家好,我叫".$this->name; echo",今年".$this->age."岁<br/>"; } } $p1=new Person(); $p1->name="张三"; $p1->age=20; $p1->intro(); $p2=new Person(); $p2->name="李四"; $p2->age=22; $p2->intro();
一个系统函数:get_class(对象)
作用:获得某个对象的“所属类名”——结果只是一个类名字符串。
$class_name = get_class($p1); //结果是:”Person”
静态属性
定义:只隶属于类本身——也可以看做是所有对象的“共有数据”。
使用:
//静态属性 class C1{ static $v1=10; //静态属性 } C1::$v1=100; //修改静态属性的值 $s1=C1::$v1; //取得静态属性的值 echo "s1=$s1"; $c1=new C1(); $c2=new c1(); echo "<br/>c1的中的静态属性v1=".$c1::$v1; $c1::$v1=1000; //通过$c1修改了静态属性值 echo "<br/>c2的中的静态属性v1=".$c2::$v1;
静态方法
方法的前面加上static关键字修饰,就变成了静态方法。
静态方法同样隶属于类,而不是隶属于具体对象。使用方法跟静态属性类似:
类名::静态方法名();
静态方法是只隶属于类,而为所有对象所“共有”。
注意1:$this在静态方法中不能使用。
self:代表当前类。
class S2{ public $v1=1; static function getNew(){ return new self; //self代表"当前类" } //new self代表当前类的一个对象 } echo"<hr />"; $obj2=S2::getNew(); //t通过S2的静态方法得到该类的一个新对象 var_dump($obj2);
构造方法和析构方法:
构造方法是“创建”对象的时候会自动调用。
析构方法是“销毁”对象的时候会自动调用。
class student{ public $name="匿名"; public $sex="未知"; static $age=18; const food="馒头"; function intro(){ echo"<b/>hi,大家好,我叫".$this->name; echo",我是".$this->sex."生<br/>"; echo ",我爱吃".self::food."。<br>"; } function __construct($n,$s){ //构造方法 $this->name=$n; $this->sex=$s; } function __destruct(){ //析构方法 echo"<br/>被销毁了"; } } echo"<hr/>"; $student1=new student('刘能','男'); $student1->intro(); $student2=new student('赵四','男'); $student2->intro(); echo"<hr/>";