1、类、对象、传值引用、$this关键字、静态属性和静态方法、self、构造方法、析构方法
通常,对象离不开类,没有类,就没有对象。
定义类:变量->属性,(属性就是放在类中的变量)
函数->方法,
常量->类常量
一、一个类的基本操作
1、定义一个类 class C1{ }
2、类中含有属性、方法、常量
3、创建一个类的对象 $a=new C1();
4、使用对象,对象中有属性、方法、和常量
用对象调用属性 $对象->属性名 例:$a->name=""; 注:属性名前面没有$符号
用对象调用方法 $对象->方法名() 例:$a->test();
用对象调用常量 (1).类外调用常量 对象名::常量名
(2).方法中调用常量 类名::常量名
(3).方法中调用常量 $this::常量名
例子:写一个人类对象,具有3个属性,并能够完成求直角三角形的斜边的工作
。
<?php
class Person{
public $a=10; //举例定义变量
const PI=3.14; //举例定义常量
function getxiebian($x,$y){
$z=pow(($x*$x+$y*$y),0.5);
return $z;
}
}
$result=new Person();
$z1=$result->getxiebian(3,4);
echo $z1;
?>
二、创建对象的几种方式
方式1:直接创建对象
$对象名=new 类名(); //对象名就是变量名,类是已经定义过的
方式2:把一个类名赋值给一个变量
$变量名1="类名";
$变量名2=new $变量名1();
方式3:
$对象名=new self; //self指代类本身
//注意:这行代码只能在类内部方法中使用
方式4:通过对象创建一个新的对象
$对象名1=new $对象名2;
三、对象的传值
值传递:传递的时候,拷贝的是数据本身。默认都是值传递。
结果:传递完之后,有了2份同样的数据,但两个变量“相互独立”没有关系。
引用传递:传递的时候,拷贝的是引用关系。需要使用“&”才能实现引用传递。
结果:传递完之后,数据仍然只有一份,但是两个变量共同指向该数据。
四、$this关键字
$this是一个“伪对象”,代表当前所属类的当前对象。
扩充:get_class($对象名); 获取当前对象的“所属类名”
五、静态属性和静态方法
(一)、静态属性: static $属性名
作用:隶属于类本身,也可以看做是所有对象的“共有数据”
使用方法:(1)、类::$静态属性名
(2)、实际上,通过对象也可以使用静态属性(但属于最新的语法,也不推荐) $对象名::$静态属性名
静态属性注意:
1、静态常量在本类中调用 类名::常量名($变量名)
2、静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
3、静态属性不可以由对象通过 -> 操作符来访问。
4、静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。
5、静态属性能在子类中继承,静态属性声明了public static能在外部调用,子类名::$静态属性名 或 父类名::$静态属性名
(二)、静态方法:static $静态方法名()
作用:从理念上,可以认为,静态方法是只隶属于类,而为所有对象所“共有”。
使用方法:类名::静态方法名();
注意:1、如果通过类名来调用静态方法,则该方法中不可以出现$this关键字。即$this在静态方法中不能使用。
2、静态方法中不应调用非静态方法。
3、静态方法的调用 类外调用:new类名,通过对象::函数名;通过类名::函数名调用,$this在静态函数中不能用
六、self
含义:代表当前类
使用:通常只能在某个类的某个方法内部代表该类的名称。
例如:
class S2{
public $v1=1;
static function getNew(){
return new self; //self代表“当前类”
//new self就是当前类的一个对象
}
}
$obj2=S2::getNew(); //通过S2的静态方法得到该类的一个新对象
七、构造方法
构造方式是类中的一个“特殊”方法,其作用是在实例化一个对象的同时,给该对象的属性赋值,使之一创建完成,就具有了其本身的特有数据(属性值)。
1,该方法名字是固定的,为:__construct();
2,该方法必须是普通方法(不能是静态方法)
3,通常该方法应该是public
4,通常该方法中使用$this这个关键字来对属性进行赋值
5,当new 类名()的时候,其实是在调用该构造方法
6,如果一个类中定义了构造方法,则实例化该类时就会调用该方法,且实例化时的参数需要跟构造方法的参数匹配
注意:
1、若有构造方法,在创建一个对象的时候,new 对象名(值的个数必须和够着方法对应)
2、如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承
八、析构方法
构造方法是“创建”对象的时候会自动调用。
析构方法是“销毁”对象的时候会自动调用。
系统方法通常用于在销毁对象的时候来“清理数据”(打扫战场)——如果需要,就可以利用这个机会去处理。
通常,php程序结束后,所有对象都会自动销毁(其实属于php内部的垃圾回收机制)
说明:
1,析构方法通常不太需要去定义。
2,析构方法不能调用。
3,析构方法不能有形参。
4,析构方法中可以用于清理一些在php代码结束后不能清理的数据,如生成的文件。
对象销毁的几个情形:
1)、脚本程序运行结束,自动销毁;
2)、明确地unset()一个对象变量,则被销毁;
3)、改变对象变量的值,被销毁;
注意:
和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。
一个完整的代码演示:
<?php
class C{
//类常量:
const const1 = 1;
//一般(实例)属性:
public $v2 = 2;
//静态属性:
static $v3 = 3;
//一般(实例)方法:
function f1(){
echo "<br /><b>实例方法:</b>";
echo "<br />实例方法中可以访问实例属性:v2 = " . $this->v2;
echo "<br />普通方法中操作类常量:" . C::const1;//也可以通过$this::const1
echo "<br />普通方法中操作静态属性:" . C::$v3;
echo "<br />普通方法中调用静态方法:";
C::f2();
}
//静态方法:
static function f2(){
echo "<br /><b>静态方法:</b>";
echo "<br />静态方法中使用类常量:" . C::const1;
echo "<br />静态方法中使用静态属性:" . self::$v3;//self指其本身所在的类";
}
//构造函数:
function __construct($para1 = 2){
echo "<br /><b>构造方法被执行。</b>";
$this->v2 = $para1;
}
//析构方法:
function __destruct(){
echo "<br /><b>析构方法被执行。</b>";
}
}
$obj1 = new C(20);
echo "<br />对象obj1的v2的值为:" . $obj1->v2;
//对象操作普通方法:
$obj1->f1();
?>