PHP中如何定义类及其成员属性与操作
PHP中如何定义类及其成员属性与操作
类的概念:类是具有相同属性和操作的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和操作两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和操作说明两个主要部分。1、类的定义:
i. 类的关键字定义使用class
1.定义一个空类
Class Person{};
2.定义一个有成员属性和操作的类
Class Person{
成员属性........
操 作........
}
3.定义一个不能被继承的类,使用final关键字
Final class Person{
成员属性........
操 作........
}
4.注意:final关键字不能用来修饰成员属性 ,只能修饰类和方法(final方法后面介绍)
5.这里举一个带有final的class
定义一个final的类FinalClass,包含一个公共函数
final class FinalClass {
public function ffun() {
echo “本类为final类”;
}
}
定义一个类ChildFinalClass 并继承FinalClass 类
class ChildFinalClass extends FinalClass {
public function fchildfun() {
echo ‘本类继承final类FinalClass ’;
}
}
这样当执行以上命令的时候系统会提示
Fatal error: Class ChildFinalClass may not inherit from final class (FinalClass)
证明由final关键字定义的class是不可以被子类继承的
2、类中成员属性的定义
i. 成员属性就是对该类定义的一些变量属性,那人作为一个类来说,人都有一对眼睛(正常的啊,二郎神除外),一张嘴,两个耳朵,等这样的一些固定的用来描述或表现某种事物的专有名词称为成员属性
ii. 类中成员属性的声明使用的关键字
iii. 常见成员属性声明是由关以下键字
public,var,protected,private开头的,然后跟一个变量来组成的。还有一些成员属性包括,静态static,常量const.
Public: 表示全局的,类内部外部子类都可以访问
Var: php 5 版本中会认为这个成员属性为public类型的属性
protected 表示受保护的,只有本类或子类或父类中可以访问
private
表示私有的,只有本类内部可以使用
Static: 1)静态的属性,
2)用static修饰的成员属性可以被同一个类的所有对象共享
3) 静态的数据是在类第一次被加载的时候就存在了内存中的数据段中(初始化静态段)
4)类中使用self::成员属性名
5)类外 类名::成员属性名
Const: 1)类中常量属性,在类中声明常量必须使用const
2)类中使用 self::成员属性名
3)类外使用 类名::成员属性名
注意:属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段时就为常数,而不是在编译阶段之后在运行阶段运算出的常数。例如,不能包含任何运算符,不能是任何变量,不能是一个函数等。
iv. 成员属性的调用方式:
在类的成员方法里面,可以通过 $this->property(property是属性名字)这种方式来访问类的属性、 方法,但是要访问类的静态属性或者在静态方法里面却不能使用,而是使用 self::$property。 在类的非静态方法里面可以使用伪变量 $this,这个伪变量是调用该方法的实例化对象引用。
接下来用代码对上面的内容做一下解释:
class FinalClass {
//static $a = strTolower();
//这种写法错误
//const A = 1+2; //这种写法错误
//public $name = 123+456;
//这种写法错误
static $a = '$a';
const A = 'A';
public $name = '凤姐';
protected $sex = '男+女';
private $age = 23;
}
class ChildFinalClass extends FinalClass{
public function fchildfun(){
echo 'ChildFinalClass类中ChildFinalClass::$a->'.ChildFinalClass::$a."<hr>";
Echo 'ChildFinalClass类中ChildFinalClass::A->'.ChildFinalClass::A."<hr>";
echo '大家好,我叫'.$this->name."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
//由于age是私有的成员属性,所以在这里将不会被调用,将提示没有定义此属性在ChildFinalClass类中。
}
}
$obj = new ChildFinalClass();
$obj->fchildfun();
3、类中操作的定义
i. 我本人一般喜欢叫操作为成员方法,以下我会叫操作为方法其实都是一样的
ii. 成员方法的定义:成员方法就是对该类定义的一些函数方法,比如拿这个类来例句例子,人能吃饭,能跑步,能敲代码,这就是成员方法。也就是可以做一些可执行性的动作我们理解为成员方法
iii. 成员方法的访问和成员属性一样可以参照上面成员属性的访问介绍。
iv. 成员方法和成员属性一样也包括public,protected,private,static,final并且作用域也是一样的,接下来举一些例子供大家参考和理解。
v. 静态的成员方法只能访问静态的成员属性和成员方法,并且类内部访问静态方法可以使用self::静态方法(), 类外部访问使用类名::静态方法()
1. 自定义方法:
class FinalClass {
static $a = '$a';
const A = 'A';
public $name = '凤姐';
protected $sex = '男+女';
private $age = 23;
//定义一个公共方法
public function publickfun(){
echo 'FinalClass类中self::$a->'.self::$a."<hr>";
echo "FinalClass类中self::A->".self::A."<hr>";
echo '大家好,我叫:'.$this->name."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
}
//定义一个受保护的方法
protected function protectedfun(){
echo 'FinalClass类中self::$a->'.self::$a."<hr>";
echo "FinalClass类中self::A->".self::A."<hr>";
echo '大家好,我叫:'.$this->name."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
}
//定义一个私用方法
private function privatefun(){
echo 'FinalClass类中self::$a->'.self::$a."<hr>";
echo "FinalClass类中self::A->".self::A."<hr>";
echo '大家好,我叫:'.$this->name."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
}
}
class ChildFinalClass extends FinalClass{
public function fchildfun(){
echo 'ChildFinalClass类中ChildFinalClass::$a->'.ChildFinalClass::$a."<hr>";
Echo 'ChildFinalClass类中ChildFinalClass::A->'.ChildFinalClass::A."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
//由于age是私有的成员属性,可以理解为我不想让别人知道我的年龄,所以在这里将不会被调用,将提示没有定义此属性在ChildFinalClass类中。
$this->publickfun();
$this->protectedfun();
$this->privatefun();
//由于privatefun是私有的成员方法,所以在这里将不会被调用。
}
}
$obj = new ChildFinalClass();
$obj->fchildfun();
2.魔术方法
i. 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此
ii. 从PHP 5以后的版本,PHP中的类就可以使用魔术方法了。其规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法,接下来列出一些魔术方法,如果大家想详细了解可以针对某一个进行查询了解,这里就不大篇幅的介绍了。
1、__construct() 构造方法
__destruct()
析构方法
2、__clone()
如果想复制一个对象则需要使用clone方法
3、__toString()
方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时
4、__sleep() 串行化的时候用
__wakeup 反串行化的时候调用
5、 __set_state()
当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)
6、__invoke(PHP 5.3.0以上版本有效)
当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
7、__callStatic(PHP 5.3.0以上版本有效) 是为了处理静态方法调用
8、__get() 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名。
__set() 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。 这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。
9、__isset() 当在一个未定义的属性上调用isset()函数时调用此方法
__unset() 当在一个未定义的属性上调用unset()函数时调用此方法
10、__call( $method, $arg_array )
当调用一个未定义的方法是调用此方法
这里的未定义的方法包括没有权限访问的方法;如果方法不存在就去父类中找这个方法,如果父类中也不存在就去调用本类的__call()方法,如果本类中不存在__call()方法就去找父类中的__call()方法。
11、__autoload() 自动加载魔术方法