php学习笔记之--面向对象常用关键字与魔术方法
面向对象常用关键字与魔术方法
/***************final***********/
final class Demo {
.......
}
final function demo() {
........
}
1.final不能修饰成员属性
2.final只能修饰类和方法
3.使用final修饰的类不能被子类继承
4.使用final修饰的方法不能被子类覆盖
/*********static*******/
1.使用static修饰成员属性和成员方法,不能修饰类。
2.用static修饰的成员属性,可以被同一类的所有属性所共享,使用其中一个对象改动类的属性,其他对象的也会改变。
class Demo {
var $name;
var $age;
static $edu="hicc";
........
}
$demo1=new Demo;
$demo2=new Demo;
$demo3=new Demo;
$demo1->edu="hbu"; //demo1对象改变静态成员的edu属性的值
Demo::$edu="hbu"; //也可以通过类直接修改
//因为静态成员属性共享,所以demo2,demo3的输出也会改变
echo $demo2->edu;
echo $demo3->edu;
3.静态变量static是存在内存的数据段中(即初始化静态段)
4.静态的数据实在类被第一次加载时分配到内存中的,以后再用到类是直接从数据段中获取。
5.什么是类被加载?只要在程序中使用到这个类就是被加载(有这个类名出现)
注意:静态的成员都要用类名去访问,不用创建对象,不用对象去访问
类名::静态成员
6.类一级别通过::访问,对象级别通过=>访问。
7.self::本类方法和属性
parent::父类方法和属性
class Demo1 {
........
function say(){
........
}
........
}
class Demo2 extends Demo1 {
.......
function eat(){
........
}
function test (){
parent::say(); //调用父类方法
self::eat(); //调用本类方法
}
}
8.静态方法(static修饰的方法)不能访问非静态的成员(但在非静态方法中可以访问静态成员)
因为非静态成员,要通过对象来访问,访问对象内部的成员使用的是$this
静态方法不能使用对象来调用,也就没有对象。
注:如果确定一个方法不使用非静态成员,则可以将这个方法声明为静态方法(这样可以不用创建对象直接通过类名就可以访问,既省空间,速度又快)
9.单例模式(某个类只能有一个对象,比如数据库连接类)
/**********const*********/
1.只能修饰成员属性
2.在类中声明常量属性,使用方法与在类外声明常量define()是一样的。
class Demo {
......
const HOST="localhost"; //在声明时赋值(四种标量数据类型)
......
self::HOST; //类内部访问
}
echo Demo::HOST; //在类外部访问
Demo::HOST="test"; //语法错误,常量值不能修改
3.访问方式和stactic修饰类中静态属性一样(在类外使用 类名::常量 ,在类内部 self::常量)
4.常量一定要在声明时就给值
面向对象常用的魔术方法
/***********__call()**********/
作用:在调用对象中不存在的方法时就会出现系统报错,然后程序退出。可以使用__call()方法,在调用一个对象不存在的方法时自动调用__call()处理一些不存在方法的错误使用。
使用:
__call($methodname,$args){
.........
}//传入两个参数,调用的方法名,和该方法的参数(因为参数为多个所以定义的为数组)。
class Test
function __construct()
{
echo "before";
}
}
$t = new Test();
/***********__destruct()*********/
PHP将在对象被销毁前(即从内存中清除前)调用这个方法,
默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源,析构函数允许你在使用一个对象之后执行任意代码来清除内存.
在一个函数的命名空间内,这会发生在函数return的时候.对于全局变量,这发生于脚本结束的时候.
如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset.
{
function __destruct()
{
echo "end";
}
}
$t = new Test();
/***********__get( $property ) *********/
如果试图读取一个对象并不存在的属性的时候,PHP就会给出错误信息,传递的参数是被访问的属性名。如果在类里添加__get方法,并且我们可以用这个函数实现类似java中反射的各种操作
{
public function __get($key)
{
echo $key . " 不存在";
}
}
$t = new Test();
echo $t->name;
就会输出:
name 不存在
/***********__set( $property, $value ) *********/
当试图向一个并不存在的属性写入值的时候被调用,传递的参数是被设置的属性名和值。
{
public function __set($key,$value)
{
echo '对'.$key . "附值".$value;
}
}
$t = new Test();
$t->name = "aninggo";
就会输出:
对 name 附值 aninggo
/***********__isset() *********/
/***********__unset() *********/
__unset() 当对一个未声明或者访问级别受限的成员属性调用unset函数时调用此函数,共用户做一些操作
/***********__toString()*********/
直接输出对象引用时调用,用来快速获取对象的字符串表示的最便捷的方式。
class Demo {
var $name;
.......
function __tostring (){
return "{$this->name}";
}
}
$demo=new Demo;
echo $demo; //直接输出对象name属性
/**************__clone()***************/
1. $p1=$p; //这不是克隆,只是一个对象两个引用 ,指向的都是同一块内存,改动其中一个,另一个也会变。可以用析构__destruct来查看是否释放了两块内存。
$p1=clone $p // 克隆对象。
2. __clone() 实在克隆对象时自动调用的方法。(只要对象一诞生就要有初始化的动作,和构造方法_construct初始化一样)
$this->name中的$this关键字访问的是clone后的对象。
$that->name是代表clone对象的
class Demo {
.........
function __destruct() {
echo "{this->name}"; //
}
}
$demo1=new Demo;
$demo2=$demo1; //不是克隆,只是一个对象两个引用。释放一个对象内存
$demo3=clone $demo1; //克隆对象。释放两个对象内存
/*******************__autoload()*****************/
注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误,所以应该在函数本身做捕获。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/*********one.class.php******/
class One {
function one (){
echo "one";
}
}
/*********two.class.php******/
class Two {
function two (){
echo "two";
}
}
/*********three.class.php******/
class Three {
function three (){
echo "three";
}
}
/***********test.php**********/
function autoload($className){
//只要在类中使用到类,就会自动将类名传给这个参数
include "./".$className."class.php";
}
$one=new One;
$one->one();
$two=new Two;
$two->two();
$three=new Three;
$three->three();
/**************对象串行化(序列化)************************/
//////////__sleep()//////////
/////////__wakeup()////////////
/**************__set_state************************/
当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。
本方法的唯一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性。
/**************__invoke(PHP 5.3.0以上版本有效)************************/
当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
/**************__callStatic(PHP 5.3.0以上版本有效)************************/
它的工作方式类似于__call() 魔术方法,__callStatic() 是为了处理静态方法调用。
PHP 确实加强了对 __callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此