Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PHP面向对象--常见的关键字及方法 #22

Open
hubvue opened this issue Dec 22, 2018 · 0 comments
Open

PHP面向对象--常见的关键字及方法 #22

hubvue opened this issue Dec 22, 2018 · 0 comments
Labels
PHP Extra attention is needed

Comments

@hubvue
Copy link
Owner

hubvue commented Dec 22, 2018

final关键字

在PHP5中新增加了final关键字,它只能用来修饰类和方法.不能使用final这个关键字来修饰成员属性.

final的特性

  1. 使用final关键字标识的类不能被继承
  2. 使用final关键字标识的方法不能被子类覆盖(重写),是最终版本

目的

  1. 安全
  2. 没必要被继承或重写

static关键字

static关键字表示静态的意思,用于修饰类的成员属性和成员方法(即静态属性和静态方法).

类中的静态属性和方法不用实例化(new)就可以直接使用类名访问

格式: 类::静态属性 类::静态方法

在类的方法中。不能使用this来引用静态变量或静态方法,而需要用self来引用

格式:self::静态属性 self::静态方法

特点

  1. 静态方法中不可以使用非静态的内容。就是不让使用$this
  2. 静态属性是共享的。也就是new很对对象也是共用一个属性。

const关键字

const是在一个类中定义常量的关键字,我们都知道在PHP中定义常量使用的是“define()”这个函数,但是在类里面定义常量使用的是“const”这个关键字。

const CONSTANT = "constant value";    //定义
echo self ::CONSTANT          //类内部访问
echo className::CONSTANT     //类外部访问

instanceof关键字

instanceof关键字用于检测当前对象实例是否属于某一个类或者这个类的子类。

自动加载类

PHP5当new实例化一个不存在的类时,则自动调用此函数__autoload(),并将类名作为参数传入此函数。可以使用这个实现类的自动加载。

class_exists---检查类是否已定义

格式:bool class_exists(String $class_name[,bool $autoload])

如果由class_name所指的类已经定义,此函数返回TRUE,否则返回FALSE。

默认将会尝试调用__autoload,如果不想让class_exists()调用__autoload,可以将autoload参数设为FALSE。

get_class ---返回对象的类名

格式:string get——返回对象的类名

返回对象实例obj所属类的名字。如果obj不是一个对象则返回FALSE

get_object_vars--返回由对象属性组成的关联数组

格式:array get_object_vars(Object $obj)

返回由obj指定的对象中定义的属性组成的关联数组。

get_parent_class -- 返回对象或类的父类名

格式:string get_parent_calss([mixed $obj])

如果obj是对象,则返回对象实例obj所属类的父类名

is_a ---如果对象属于该类或该类是此对象的父类则返回TRUE

格式:bool is_a(object $object , string $class_name)

我们可以使用运算符:instanceof代替上面的is_a操作。

__toString

当我们用echo输出一个引用对象的时候,会报错,如果在类中提供__toString方法,就不会产生错误,而自动调用__toString方法,输出__toString方法中返回的字符串,所以__toString方法一定要有个返回值(return语句)

class Test{
   public function __toString(){
          return "hello";
     }
 }
$test = new Test();
echo $test; //hello

clone

根据一个对象完全可克隆出一个一模一样的对象,是非常有必要的,而且克隆以后,两个对象互不干扰。

class Test{
    public $name = "wang";
}
$t1 = new Test();
$t2 = clone $t1;
$t2 -> name = "chong";
echo $t1 -> name;

对象序列化

有时候需要吧一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,再还原为原来的对象,这个过程就叫做序列化(串行化)

对象序列化的两种情况

  1. 第一种情况就是把一个对象在网络中传输的时候要将对象串行化。
  2. 第二种情况就是把对象写入文件或是数据库的时候用到串行化。

两个过程

  1. 串行化:就是把对象转化为二进制字符串,通过serialize()函数实现
  2. 反串行化:就是把对象转化的二进制字符串再转为对象,通过unserialize()函数实现
class Test{
    public $name = "wang";
    public function say(){
        return "hello";
    }
};
$test = new Test();
$testString = serialize($test);
echo $testString;
$untest = unserialize($testString);
echo $untest -> name;       //wang

__sleep()和————wakeup

当对象进行序列化的时候,调用类中的__sleep()方法,这个方法返回一个数组,数组中包含对象的属性,串行化只串行属猪中包含的属性,未被包含的则在串行化的时候被忽略,如果没有__sleep()方法,PHP将保存所有属性。

当对象进行反序列化的时候,调用类中的__wakeup()方法。

class Test{
    public $name = "wang";
    public $age = 18;
    public $sex = "nan";
    public function __sleep(){
        $arr  = array('name','age');
        return $arr;
    }
    public function __wakeup(){
        $this -> age = 20;
    }
}
$test = new Test();
$testString = serialize($test);
echo $testString;    
$test1 = unserialize($testString);
echo $test1 -> age ;        //20

__autoload()

在软件开发过程中,不可能把所有的类都写在一个php文件中,当一个文件调用另一个文件的时候就需要用include或者require,有时候一一导入所需要的类的php文件是一个很头疼的问题,所以__aotuload可以完成一个自动加载类,实现按需加载的形式。

在PHP5中,可以定义一个__autoload函数,它会在视图使用尚未被定义的类时自动调用,通过调用次函数,脚本引擎在PHP出错失败前有个最后一次机会加载所有的类,__autoload()函数接受一个参数,就是想要加载的类名,通过拼接前缀或者后缀实现按需加载类.

function __autoload($className) {
    require_once $className.".php";
}
try{
        $obj = new php1();
}catch(Exception $e){
    echo $e ->getMessage();
}
@hubvue hubvue changed the title PHP面向对象--常见的关键字 PHP面向对象--常见的关键字及方法 Dec 22, 2018
@hubvue hubvue added the PHP Extra attention is needed label Jan 8, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
PHP Extra attention is needed
Projects
None yet
Development

No branches or pull requests

1 participant