属性:
属性就是“变量”,只不过现在它写在了类中,就称为属性;
方法:
方法就是“函数”,只不过现在它写在了类中,就称为方法;
注意:属性和变量,方法和函数的区别是,变量和函数是独立存在的,一般是独立调用。而属性和方法只能通过这个类或者这个类的对象才能去调用。
通过一个类创建出来的对象,直接拥有这个类的属性和方法。
<?php
class MyGirl{
var $name = "小花"; //此时它叫做“属性”(原来是变量)
var $age = 18;
var $edu = "大学";
//此时,它叫做“方法”(原来是函数)
function xiyifu{
echo "<br />{$this->age}岁{$this->edu}学历的{$this->name}再勤快的洗衣服";
}
function zuofan{
echo "<br />{$this->age}岁{$this->edu}学历的{$this->name}再快乐的做饭";
}
}
$obj1 = new MyGirl();
$obj1->xiyifu();
$obj1->zuofan();
?>
注意:
类中只能有属性方法常量三种成员。
<?php
class A{
public $a = 10;
echo $a; //错误,此行既不是属性也不是方法和常量,不为类所接受。
if($a > 0){ //错误,此循环既不是属性也不是方法和常量,不为类所接受。
echo $a;
}
}
?>
类成员的概述
面向对象的编程,是需要通过“对象”去做什么事情以完成某个目标。而对象源于类。
所以——面向对象编程,一切都是从定义类开始。
类中成员分为三大类:
1.属性:
a.普通属性;
b.静态属性;
2.方法:
a.普通方法;
b.静态方法;
c.构造方法;
d.析构方法;
3.常量
在使用习惯上,我们会把常量放前面,然后是属性,最后是方法。但顺序不是这样也没什么问题。
类常量
当在类中定义一个常量时,该常量就称为“类常量”。
语法形式:
calss 类名{
const 常量名 = 常量值;
}
使用形式:
常量的使用,是通过类名,并使用范围解析符(::)来取用的。
示例:
<?php
class C1{
//定义类常量;
const P = 3.14;
const G = 9.8;
}
//使用类常量;
$v1 = C1::P*3*3;
echo "<br />v1 =$v1"; //v1 = 28.26
echo "<br />C1::G = ".C1::G; //C1::G=9.8 .常量在双引号中不会被编译
?>
类属性
普通属性(实例属性)
实例,也叫做“对象”;
实例(普通)属性,就是一个可以在一个类实例化的对象上使用的属性。
语法形式:
class 类名{
var
属性名=初始值;var
属性名; //这个属性没有初始值;
//也可以使用pubic来定义属性。
public
属性名=初始值;public
属性名;
}
使用形式:
可以通过该类的对象,来使用实例属性。(把它当成一个变量)
$对象->属性名;
静态属性
静态属性,本质上也是“变量”,但它的特点是——该变量只隶属于类本身,即:一个类中的一个静态属性,就只有一份数据,不会被复制。而实例属性,则是会被每个对象“复制”;
语法形式:
class 类名{
static $属性名 = 初始值;
static $属性名; //该属性没有初始值
}
使用形式:
使用类名和范围解析符(::)来对静态属性进行操作:
类名 :: $静态属性名;
示例:
类方法
普通方法(实例方法)
实例方法是一个类中定义的方法,可以为这个类的所有对象调用。
语法形式:
class 类名{
function 方法名(形参1,形参2,...){
//方法体。。。
}
}
使用形式:
$对象名->方法名(实参1,实参2,…);
静态方法:
一个类中定义的方法,只隶属于这个类本身,而不属于这个类的所有对象。
语法形式:
class 类名{
static function 方法名(形参1,形参2,...){
//方法体。。。
}
}
使用形式:
类名 :: 方法名(实参1,实参2,…);
普通方法和静态方法的综合示例:
<?php
class C1{
public $p1 = 1; //实例属性
static $p2 = 2; //静态属性
//实例方法
function showInfo1(){
echo "<br />实例方法被调用!";
echo "<br />p1的值为:".$this->p1;
//$this代表一个对象,就是调用当前这个方法的对象。
//实例方法中,也可以去使用“静态属性”
echo "<br />p2的值为:".self::$p2;
//self相当于$this。调用的是本身所在的类,这里的self代表C1中的静态类
}
static function showInfo2(){
echo "<br />静态方法被调用!";
echo "<br />p2的值为:".self :: $p2;
//self和$this都是重要的概念。
//静态方法中,通常不能使用实例属性。
}
}
$o1 = new C1();
$o1->showInfo1(); //使用对象调用实例方法
C1 :: showInfo2(); //使用类调用静态方法
?>
构造方法(__construct)
构造方法,是一个特殊的方法:
1.构造方法的名字是固定的:__construct;
2.该方法通常都不要我们自己调用,而是在new一个对象的时候,会首先自动调用的方法;
3.该方法主要的目的是为了在new一个对象的时候,给该对象设置一些“初始值”。(进行初始化工作)
4.构造方法的参数没有规定,通常根据实际需要来定义,目的是为了对象属性数据的初始化。
5.如果一个类中定义了构造方法,那么实例化该类时,就会自动调用该方法。且实例化类的参数需要与构造方法的参数相匹配。
示例:
<?php
class MyGirl{
var $name;
var $age;
var $edu;
function __construct($p1,$p2,$p3){
$this->name = $p1;
$this->age = $p2;
$this->edu = $p3;
}
function xiyifu{
echo "<br />{$this->age}岁{$this->edu}学历的{$this->name}正在开心的洗衣服";
}
}
//new这个MyGirl类的同时,就自动调用了_construct($p1,$p2,$p3)这个方法,所以要在new的时候加对应的实参
$obj1 = new MyGirl('小星',20,'初中');
$obj1->xiyifu();
$obj1 = new MyGirl('小西',22,'大学');
$obj1->xiyifu();
?>
析构方法(__destruct)
1.析构方法是一个特殊的方法,名字为固定的词:__destruct
2.析构方法是在一个对象被“销毁”的时候会自动被调用的方法——我们无法调用它。
3.析构方法不能带参数(形参),但方法中也可以使用$this这个词,代表当前对象。
static关键字的新用法
static可以跟self一样,代表”当前类“,用于访问一个类的”静态属性或静态方法“。
但是static比self更灵活,因为static代表的是当前方法的类,而不是其代码所在的位置的类。
而self只能代表其代码所在的位置的类。
示例:
<?php
class A{
static $p1 = 5;
static function showOb(){
echo "<br />".self :: p1;
echo "<br />".static :: p1;
}
}
class B extends A{
static $p1 = 10; //class B 中的$p1被重写了
}
A :: showOb();
B :: showOb();
?>
//结果:
5
5
5 (重写后self依然读取其所在位置的类的信息)
10(重写后static读取调用它的对象的类的信息)