PHP面向对象的语法,面向对象只可意会不可言传,万物皆对象:
定义类
1. 定义属性(变量)
2. 定义方法(函数)
3. 定义常量(类常量)
定义类
创建类对象(实例化)
创建类对象使用对象
Snip20170306_4.png1. 使用对象中的属性(变量)
2. 使用对象中的方法(函数)
3. 使用对象中的常量(类常量)
对象创建方式:
//方式0
$person1 = new C1();
//方式1
$CName = "C1";
$person3 = new $CName();
//方式2
$CName2 = new self;
//方式3
$person4 = new $person3;
对象传值
- 值传递:传递的时候拷贝一份传过去。默认方式。
- 引用传递:传递的就是本身,若修改本身也会被修改,需要加“&”。
注意:默认方式是指传递,为什么打印结果是引用传递呢?其实确实拷贝出了新对象,但是新对象中的一个内部指针(指向具体指)却是被完全复制下来的,之前指向什么,拷贝内部指针后还会指向它,而这个数字就是内部指针指向的内容,如图:
Snip20170306_8.png类中的方法:
<?
class Person{
public $x = 1;
public $y = 1;
public $PI = 3.14;
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/>斜边:".$xie1;
?>
方法中$this关键字
$this是一个“伪对象”,类似于iOS中的self
<?
class Person{
public $name = "匿名";
public $age = 18;
//自我介绍方法
function introduce(){
echo "<br/>我叫".$this->name;
echo "<br/>年龄".$this->age;
}
}
$p2 = new Person();
$p2->name = "大牛";
$p2->introduce();
//打印结果:
//我叫大牛
//年龄18
?>
//获取某个对象所属的类名。结果只是一个类名字符串
get_class(对象名)
静态属性
在定义属性的时候,前面加上关键字:static。作用:一般属性的值隶属于一个类对象,静态属性是所有对象的“共有数据”。下面例子中可以证明:
<?
class C2{
static $v1 = 10;
}
C2::$v1 = 100;
$s1 = C2::$v1;
echo "<br/>s1 = $s1";
//输出结果:s1 = 100
$c1 = new c2();
echo "<br/>".$c1::$v1;
//输出结果:100
$c1::$v1 = 200;
$c2 = new c2();
echo "<br/>".$c2::$v1;
//输出结果:200
?>
静态方法
在方法名前添加static就变成了静态方法,静态方法属于类,不属于具体对象。使用方法和静态属性类似。
class S1{
public $v1 = 1;
static $v2 = 2;
static function showInfo(){
echo "<br/>显示信息";
//错误写法:不能在静态方法里面调用对象属性,因为静态方法通过类名调用
//echo "v1 = ".$this->v1;
echo "v2= ".S1::$v2;
}
}
S1::showInfo();
self
代表当前类,通常只能在某个类的某个方法内部可以使用,代表该类,
self和$this的区别:self代表当前类,$this代表当前对象,所以静态方法中可以使用self,但不能使用$this。
class S2{
//返回这个类
static function getInstance(){
return new self;
}
}
echo "<br/>";
$obj2 = S2::getInstance();
构造方法
构造方法是可理解为类的一个特殊方法,其作用是在实例化一个对象的同时,给该对象的属性赋值,使它创建完成后就具有了特定的属性值或者数据。
- 该方法名固定:__contruct();
- 该方法必须是普通方法(非静态)
- 定义构造方法后,创建对象必须以有构造方法的形式来实例化对象
<?php
class P{
public $name = "匿名";
public $age = 18;
function intro(){
echo "<br/>名字:".$this->name;
echo "<br/>年龄:".$this->age;
}
function __construct($n,$a){
$this->name = $n;
$this->age = $a;
}
}
//普通实例化
$p1 = new P();
$p1->name = "大牛弟弟";
$p1->intro();
//有构造方法的实例化
$p2 = new P('大牛',12);
$p2->intro();
?>
析构方法
构造方法在创建对象时自动调用,析构方法在销毁对象时自动调用,通常,php程序结束后,所有对象都会自动销毁(php内部具有垃圾回收机制)
- 析构方法通常不需要定义
- 析构方法不能手动调用,不能有参数
- 析构方法中可以用于清理一些php代码结束后不能清理的数据
- 先创建的对象后销毁,栈的概念
- 销毁时机:当没有指针指向这个对象时对象就会被销毁,或使用unset()强行销毁
网友评论