一、关键字的使用

1、final关键字

  只能用来修饰类 和 成员方法  不能修饰成员属性
  被final修饰的类不能被继承
  用final修饰的成员方法 不能被子类覆盖(重写)

<?php
// final class A{ //被修饰的类不能被继承
class A{
//被修饰成员方法不能被子类覆盖
final public function func(){
echo "你好";
}
}
class B extends A{
public function func(){
echo "今天周六...";
}
}
$a = new B();
$a->func(); //显示 Fatal error: Cannot override final method A::func() in E:\Local test\phpstudy\2.php on line 13
?>

2、static关键字的使用

  主要用于修饰类与成员方法(函数)可以不用new(实例化)就可以直接使用方法:如 类名::方法名

  在静态的成员方法中不能使用$this关键字,只能访问静态成员
      注意:静态方法在实例化后的对象也可以访问    //$对象名->静态方法名

访问形式
            在类的内部  self::$属性名  self::方法名
            在类的外部  类名::$属性名  类名::方法名

<?php
class demo{
//成员属性
static public $name = "SQYY";
//成员方法
static public function func(){
echo "我是一个方法...";
}
public function func2(){
echo self::$name;
self::func();
}
public function func3(){
echo "在php5.3之前我是静态的...";
//提示 : Strict Standards: Non-static method demo::func3() should not be called statically in E:\Local test\phpstudy\2.php on line 23
}
}
echo demo::$name;
demo::func();
?>

3、单例设计模式
        在当前脚本中只产生一个该类对象
        1.阻止在类外部使用new来实例化对象
                将构造方法私有化
        2.在类内部声明一个方法来创建对象
                将成员方法声明静态的
        3.把创建的对象存入一个位置
                把创建的对象存到静态属性中 作为依据

3、const关键字

  define("变量名","值")

  const修饰的成员属性为常量,只能修饰成员属性

  类中

  1.常量建议使用大写,不能使用$

  2.常量一定要在声明时给好初值

  3.常量的访问方式和static的访问方式相同,但只能读

类的内部 self::常量名 注意 没有$
            类的外部 类名::常量名  没有$

<?php
class MyClass{
const CONSTANT = 'CONSTANT value'; //使用const声明一个常量,并直接赋上初始值
function showConstant(){ //声明一个成员方法并在其内部访问本类的常量
echo self::CONSTANT.'<br>'; //使用self访问常量,注意常量前不要加 $
}
}
echo MyClass::CONSTANT . '<br>'; //在类外部使用类名称访问常量,也不要加 $
$class = new MyClass;
$MyClass -> showConstant() //调用对象中的方法
?>

4、instanceof关键字

   instanceof”操作符用于检测当前对象实例是否属于某一个类的类型。
        检测当前对象是否为该类或者该类的后辈类的实例化

<?php
class Person{}
class Student extends Person{} $p = new Person();
$s = new Student(); $a = $p instanceof Student; //结果为false
$b = $s instanceof Student ; //结果为true
$c = $s instanceof Person; //结果为true

二、重载

  属性重载中的四个魔术方法:__set() __get() __isset() __unset()

      * __get():当我们直接输出一个对象中的非公有属性时会自动调用的方法,
并将属性名以第一个参数传进去。
__get($name){...} * __set(); 当我们直接设置一个对象中的非公有属性时会自动调用的方法,
并将属性名以第一个参数,值作为第二参数传进去。
__set($name,$value){...} __isset()当对未定义的变量调用isset() 或 empty()时,__isset() 会被调用。
//当isset判断一个对象的非公有属性是否存在时,自动调用此方法。
public function __isset($param){
return isset($this->$param);
} __unset()当对未定义的变量调用unset()时,__unset() 会被调用。
//当unset销毁一个对象的非公有属性时,自动调用此方法。
public function __unset($param){
unset($this->$param);
}

三、其他的魔术方法

1、克隆对象

  对象复制clone 克隆一个对象,因为对象属于引用类型,普通的“=”号属于引用赋值

$p1 = new Person();
$p2 = clone $p1;
$p1 -> say();
$p2 -> say();

2、类中通用的方法 __toString()

  当我们直接要输出一个对象时,如echo $a,print $a,那么会自动调用的方法。
        注意:__toString()方法必须返回一个字串类型的值。

<?php
class Demo{
public $name = "SQYY"; public function func(){
echo $this->name;
}
//该魔术方法中必须返回一个字符串
public function __toString(){
return "Hello";
}
}
// 实例化对象
$aa = new Demo();
echo $aa; //直接输出对象引用 则自动调用了对象中的__toString()方法输出Hello
?>

3、__call()方法的应用

  调用对象中不存在的方法时会自动调用该方法。

  __call($function_name, $args)
  $function_name  访问不存在的成员方法名称的字符
  $args  访问不存在的成员方法中传递的参数数组
<?php
class TestClass{
function printHello(){
echo 'Hello<br>';
}
function __call($functionName,$args){
echo '你所调用的函数:'.$functionName. '(参数:'; //输出调用不存在的方法名
print_r($args); //输出调用不存在的方法时的参数列表
echo ')不存在!';
}
}
$obj = new TestClass();
$obj -> printHello(); //输出 Hello
$obj -> myFun('one',2,'three'); // 输出 你所调用的函数:myFun(参数:Array ( [0] => one [1] => 2 [2] => three ) )不存在!
?>

4、自动加载类

__autoload ( string $class )

$class 需要加载的类名称字符串

 没有类是自动调用 __autpload函数
<?php
//声明一个自动加载类的魔术方法 __autoload()
function __autoload($className){
//在方法中使用indlude包含类所在的文件
include(strtolower($className) .'.class.php');
}
$obj = new User(); //User类不存在则自动调用__autoload()函数,将类名'User'作为参数传入
?>

5、对象串行化

(1)、串行化

使用serialize()函数来穿行化一个对象,把对象转换为二进制字符串。serialize()函数的参数即为对象的引用名,返回值为一个对象被串行化后的字符串。serialize()返回的字符串含义模糊,一般不会解析这个字符串来得到对象的信息 
创建一个脚本文件person.class.php,并在文件中声明一个person类,类中包含三个成员属性和一个成员方法
脚本代码person.class.php如下所示
<?php
class Person{
private $name;
private $sex;
private $age; function __construct($name='',$sex='',$age=''){
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
public function say(){
echo "我说话呢...";
}
}
?>
创建一个Person类,在文件包含person.class.php文件,将person类加载进来,然后使用serialize()函数先将对象串行化,再将串行化后得到的字符串保存到file.txt文件中。
脚本文件serialize.php中代码如下
<?php
require 'person.class.php';
$person = new person('张三','男','20');
$person_string = serialize($person); //通过serialize()函数将对象串行化,返回一个字符串
file_put_contents('file.txt',$person_string); //将对象串行化后返回的字符串保存到file.txt中
?>

通过上面的示例,通过file_put_content()函数成功的将person类实例化的对象保存到file.txt文件中

 O:6:"Person":3:{s:12:" Person name";s:6:"张三";s:11:" Person sex";s:3:"男";s:11:" Person age";s:2:"20";} 
(2)反串行化
  把对象串行化后转换的二进制字符串再转换为对象,我们使用unserialize()函数来反串行化一个对象。这个函数的参数即为serialize()函数的返回值 我们并不需要解析在file.txt中保存的这个串来得到对象的信息,它只是通过对象serialize()函数串行化后返回描述对象信息的字符串,
目的是将对象持久的好存起来,以后在需要这个对象,只要通过unserialize()函数将file文件保存的字符串再反串行化成对象即可
<?php
require 'person.class.php';
$person_string = file_get_contents('file.txt');
$person = unserialize($person_string);
$person -> say();
?>

6、__sleep和__wakeup()

<?php
class Person{
private $name;
private $sex;
private $age; function __construct($name='',$sex='',$age=''){
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
public function say(){
echo "我说话呢...";
}
}
function __sleep(){
$arr = array('name','age'); //数组中的成员$name和$age将被串行化,成员$sex则被忽略
return($arr); //返回一个数组
}
function __wakeup{
$this -> age = 40; //重新组织对象时,为新对象中的$age属性重新赋值
}
?>
												

【代码总结】PHP面向对象之常见的关键字和魔术方法的更多相关文章

  1. PHP面向对象常见的关键字和魔术方法

    在PHP5的面向对象程序设计中提供了一些常见的关键字,用来修饰类.成员属性或成员方法,使他们具有特定的功能,例如final.static.const等关键字.还有一些比较实用的魔术方法,用来提高类或对 ...

  2. PHP面向对象中常用的关键字和魔术方法

    PHP面向对象中常用的关键字 final        1.final不能修饰成员属性(类中常量不是用这个关键字)        2.final只能修饰类和方法 作用:            使用fi ...

  3. Python学习笔记之面向对象编程(三)Python类的魔术方法

    python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...

  4. Python面向对象5:类的常用魔术方法

    魔术方法就是不需要人为调用的方法,基本是在特定的时刻自动触发- 魔术方法的统一的特征,方法名被前后各两个下滑线包裹 - 操作类 - `__init__`: 构造函数 - `__new__`: 对象实例 ...

  5. 牛客网Java刷题知识点之同步方法和同步代码块的区别(用synchronized关键字修饰)

    不多说,直接上干货! 扩展博客 牛客网Java刷题知识点之多线程同步的实现方法有哪些 为何要使用同步?      java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查 ...

  6. 前端学PHP之面向对象系列第二篇——魔术方法

    × 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这 ...

  7. PHP 面向对象中常见关键字使用(final、static、const和instanceof)

    PHP 面向对象中常见关键字的使用: 1.final :final关键字可以加在类或者类中方法之前,但是不能使用final标识成员属性. 作用: 使用final标识的类,不能被继承. 在类中使用fin ...

  8. php部分---面向对象静态、抽象类、oop接口、加载类、魔术方法、关键字。

    静态  static关键字 普通成员普通成员是属于对象的 静态成员静态成员是属于类的 普通方法里面可以调用静态成员静态方法里面不能调用普通成员self关键字 在类里面代表该类 普通类class Ren ...

  9. Java第11次作业:什么是继承?继承的好处?什么是覆写?super()?构造代码块?子父类初始化顺序? 抽象类能用final声明吗?final关键字声明类 方法 变量以及全局常量?抽象类的构造方法?

    什么是继承? 继承是以父类为基础,子类可以增加新的数据或新的功能.子类不能选择性地继承父类.这种技术使得复用以前的代码非常容易. JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一 ...

随机推荐

  1. DVWA全级别之XSS(Reflected)、XSS(Stored)【跨站脚本攻击】

    XSS XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强 ...

  2. FTP服务:使用 vsftpd 服务传输文件

    1.文件传输协议 今天的互联网是由几千万台个人计算机.工作站.服务器.小型机.大型 机.巨型机等具有不同型号.不同架构的物理设备共同组成的,而且即便是个人计算机,也 可能会装有 Windows.Lin ...

  3. 使用pdf.js显示pdf文件

    <script type="text/javascript" src="build/pdf.min.js"></script> < ...

  4. php对字符串的操作4之 字符串的格式化函数

    strtolower($str ) strtoupper($str ) 大小写转换 strtotime('2018-1-1 0:0') 字符串转时间戳 date('Y-m-d H:i:s',time( ...

  5. 推荐几个c/c++语言编写的游戏源码下载网站

    在游戏开发的学习或工作中,利用完好的游戏源码可以事半功倍,不仅可以逆向学习开拓思维,也可以大大减少设计周期.自己浏览了很游戏源码下载的网站,发现大多数质量都良莠不齐,且大部分需要消费才能下载,下面整理 ...

  6. Jmeter注册100个账户的三个方法

    Jmeter注册账户比如注册成千上万个账户,如何快速实现呢? 三种方法分别举例注册5个账户 1)添加CSV data config_txt 2)添加CSV data config_csv 3)函数助手 ...

  7. AD 快捷键设置

    TAA 设置自动标记原件位号 AR 设置元件向右对齐 AL 设置元件向左对齐 MS 移动所选择 CO 错误报告设置 CTRL + w 设置电气线 PN 添加net label TG 打开封装管理器 P ...

  8. Android App测试计划和设计测试矩阵

    Android APP :日程管理APP 测试计划(Test Plan): 编号 测试时间 测试类型 测试计划 1. 5.1~5.5 单元测试 单元测试是由程序员自己来完成,程序员有责任编写功能代码, ...

  9. Java - Test - TestNG: testng.xml 元素 class

    Java - Test - TestNG: testng.xml 元素 class 1. 概述 class 相关的元素 classes class methods exclude include 2. ...

  10. es6二进制数组--基础

    一.概念二进制数组由 ArrayBuffer对象 TypeArray 视图和DataView视图 三部分组成是javascript操作二进制数据的一个接口. 早在2011年2月就已经发布,但是由于ES ...