instanceof关键字
“instanceof”操作符用于检测当前对象实例是否属于某一个类的类型。
<?php
class Person{ ... ... }
class Student extends Person{ ... ... }
$p=new Person();
$s=new Student();
echo $p instanceof Student; //结果为false
echo $s instanceof Student ; //结果为true
echo $s instanceof Person; //结果为true
往大了说当然是对的~
final关键字的应用
在PHP5中新增加了final关键字,它只能用来修饰类和方法,不能使用final这个关键字来修饰成员属性,因为final是常量的意思,我们在PHP里定义常量使用的是define()函数和const关键字,所以不能使用final来定义成员属性。
final的特性:
使用final关键字标识的类不能被继承;
使用final关键字标识的方法不能被子类覆盖(重写),是最终版本;
目的:一是为了安全,二是没有必要
*
* 在PHP中final不定义常量, 所以就不会使用,也不能使用final来修饰成员属性
*
*
* 1. final可以修饰类 --- 这个类不能去扩展, 不能有子类 (不让别人去扩展, 这个类是最终的类时)
*
* 2. final可以修饰方法 --- 这个方法,就不能在子类中覆盖(不让子类去改这个方法, 或扩展这个方法的功能时, 这个方法也就时最终的方法)
*
*/
static关键字的使用
static关键字表示静态的意思, 用于修饰类的成员属性和成员方法(即为静态属性和静态方法)。
类中的静态属性和静态方法不用实例化(new)就可以直接使用类名访问。格式:
类::$静态属性 类::静态方法
在类的方法中,不能用this来引用静态变量或静态方法,而需要用self来引用。格式:
self::$静态属性 self::静态方法
静态方法中不可以使用非静态的内容。就是不让使用$this。
在一个类的方法中若没有出现$this的调用,默认此方法为静态方法。
静态属性是共享的。也就是new很多对象也是共用一个属性。
<?php
/*
* static 可以修饰属性和方法, 不能修饰类
*
*
* 1. 使用static 修饰成员属性, 存在内存的初使化表态段.
* 2. 可以被所有同一个类的对象共用
* 3. 第一个用到类(类名第一次出现), 类在加载到内存时, 就已经将静态的成员加到了内存
*
* 对象 -> 成员
* 类 :: 成员
*
* 4. 静态的成员一定要使用类来访问,
*
* 5. self可以在类中的方法中, 代表自己类的($this)
*
* 6. 静态成员一旦被加载, 只有脚本结束才释放
*
*
* 7. 在静态的方法中,是不能访问非静态的成员的
*
* 8. 只要是能使用静态的环境下声明方法, 就最好使用静态方法(效率)
*/
<?php
class Person {
static public $name="MissZhou";
public $age;
public $sex;
static public $country = "中国";
function __construct($name, $age, $sex) {
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
public static function say(){
echo "my name is : ".self::$name."<br>";
echo "i am from: ".self::$country."<br>";
}
}
echo Person::$name;
@$p=new Person("zyj",22,"f");
echo Person::$name;
注意啊 用类名调用的时候变量前面是要加$ 单态设计模式
这应该是个挺重要的设计模式,java的视频也讲过,但是实现不同 还用的着的有:工厂模式、观察者模式、mvc
单态模式的主要作用是保证在面向对象编程设计中,一个类只能有一个实例对象存在。
<?php
class DB {
private static $obj = null; //声明一个私有的,静态的成员属性$obj
private function __construct() { //私有构造方法,只能在类的内部实例化对象
echo "连接数据库成功<br>";
}
public static function getInstance() { // 通过此静态方法才能获取本类的对象
if(is_null(self::$obj)) //如果本类中的$obj为空,说明还没有被实例化过
self::$obj = new self(); //实例化本类对象
return self::$obj; //返回本类的对象
}
public function query($sql) { //执行SQL语句完成对数据库的操作
echo $sql;
}
}
$db = DB::getInstance(); //只能使用静态方法getInstance()去获取DB类的对象
$db -> query("select * from user"); //访问对象中的成员
* 单态(单例, 单件)设计模式 -- 最适合PHP使用这个设计模式 *
*
* 1. 如果想让一个类, 只能有一个对象, 就要先让这个类, 不能创建对象 , 将构造方法 private
*
* 2. 可以在类的内存使用一个表态方法,来创建对象
*
*
*/
自己的例子:
<?php
class person{
static $name=null;
private function __construct(){}
static function getObj(){
if(is_null(self::$name)) self::$name=new self;
return self::$name;
}
function __destruct(){
echo "#############<br>";
}
}
$p=person::getObj();
$p=person::getObj();
$p=person::getObj();
$p=person::getObj();
$p=person::getObj();
//echo $p=person::getObj();
为啥最后一句被注释掉了==因为它不对啊,O(∩_∩)O 那个是对象 不能直接转化成字符串滴~ 输出结果只有################一行而已
const关键字
const是一个在类中定义常量的关键字,我们都知道在PHP中定义常量使用的是”define()”这个函数,但是在类里面定义常量使用的是”const”这个关键字
const只能修饰的成员属性(常量属性),其访问方式和static修饰的成员访问的方式差不多,也是使用”类名”,在方法里面使用”self”关键字。但是不用使用”$”符号,也不能使用对象来访问。
const CONSTANT =‘constant value’; //定义
echo self::CONSTANT; //类内部访问
echo ClassName::CONSTANT; //类外部访问
<?php
/*
* define("常量名", "值");
* final 定义
*
* const 修饰的成员属性为常量, 只能修饰成员属性
*
* 类中
*
* 1. 常量建议使用大写, 不能使用$
* 2. 常量一定要在声明时就给好初值
* 3. 常量的访问方式和static的访问方式相同, 但只能读
*
* 1. 在类外部使用 类名::常量名
* 2. 在类的内部 self::常量名
*
* final 类和方法
*
* static 属性和方法
*
*
*/
class Demo {
const SEX = "男";
static function say() {
echo "我的性别是:".self::SEX."<br>";
}
}
Demo::say();