热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP中关键字与魔术方法介绍

在php中魔术方法与关键字都是我们常用的,关键字有final、static、const,魔术方法__call()、__toString()、_clone()、__autoload()

在php中魔术方法与关键字都是我们常用的,关键字有final、static 、const,魔术方法__call()、__toString() 、_clone() 、__autoload() 等等。

PHP中常用的关键字

final  

1、final只能修饰类和方法,不能修饰成员属性,作用:使用修饰的类不能被继承,修饰的方法不能被覆盖,PHP 5 新增了一个 final 关键字,如果父类中的方法被声明为final,则子类无法覆盖该方法;如果一个类被声明为final,则不能被继承。

方法示例一,代码如下:

  1. class BaseClass { 
  2.    public function test() { 
  3.        echo "BaseClass::test() called\n"
  4.    } 
  5.     
  6.    final public function moreTesting() { 
  7.        echo "BaseClass::moreTesting() called\n"
  8.    } 
  9. class ChildClass extends BaseClass { 
  10.    public function moreTesting() { 
  11.        echo "ChildClass::moreTesting() called\n"
  12.    } 
  13. // 产生 Fatal error: Cannot override final method BaseClass::moreTesting() 
  14. ?>  

方法实例二:

  1. final class BaseClass { 
  2.    public function test() { 
  3.        echo "BaseClass::test() called\n"
  4.    } 
  5.     
  6.    // 这里无论你是否将方法声明为final,都没有关系 
  7.    final public function moreTesting() { 
  8.        echo "BaseClass::moreTesting() called\n"
  9.    } 
  10. class ChildClass extends BaseClass { 
  11. // 产生 Fatal error: Class ChildClass may not inherit from final class (BaseClass) 
  12. ?> 
static

1.使用static可以修饰成员属性和成员方法,不能修饰类

2.用static修饰的成员属性,可以被同一个类的所有对象共享

3.静态的数据是存在于内存中的数据段中(初使化静态段)

4.静态的数据是在类第一次加载时分配到内存中的,后面用到时就可以直接使用了

5.只要在程序中有这个类名出现,即是类被加载,静态数据就会被分配到内存中了   注:静态的成员都要使用类名访

问:不用创建对象,不要用对象去访问静态成员,访问方法,类名::静态成员,如果在类中使用静态成员,可以使用self代表本类访问方法 self::静态成员

6.静态方法不能访问非静态成员,非静态方法可以访问静态成员,因为非静态成员必须用对象来访问,而静态成员不需要

例1代码如下:

  1. function test() 
  2.     static $var1=1; 
  3.     $var1+=2; 
  4.     echo $var1.' '
  5. test(); 
  6. test(); 
  7. test(); 
  8. ?> 

例2代码如下:

  1. Class Person{ 
  2.     // 定义静态成员属性 
  3.     public static $country = "中国"
  4.     // 定义静态成员方法 
  5.     public static function myCountry() { 
  6.         // 内部访问静态成员属性 
  7.         echo "我是".self::$country."人"
  8.     } 
  9. class Student extends Person { 
  10.     function study() { 
  11.         echo "我是". parent::$country."人"
  12.     } 
  13. // 输出成员属性值 
  14. echo Person::$country."";  // 输出:中国 
  15. $p1 = new Person(); 
  16. //echo $p1->country;   // 错误写法 
  17. // 访问静态成员方法 
  18. Person::myCountry();   // 输出:我是中国人 
  19. // 静态方法也可通过对象访问: 
  20. $p1->myCountry(); 
  21. // 子类中输出成员属性值 
  22. echo Student::$country.""// 输出:中国 
  23. $t1 = new Student(); 
  24. $t1->study();    // 输出:我是中国人 
  25. ?> 

运行该例子,输出:

中国

我是中国人

我是中国人

中国

我是中国人

首先,我们知道PHP中调用实例方法都是通过如:someobj->someFun()调用,那么我们调用静态函数是否也能像C#那样,通过SomeClass->someFun()调用呢?答案是否定的,在PHP中,对静态成员的调用只能通过::的方式进行,如:SomeClass::someFun(),代码如下:

  1. class TestC 
  2.     public static $var1=1; 
  3.     public $var2=1; 
  4.     function t1() 
  5.  { 
  6.         self::$var1+=2; 
  7.         echo self::$var1.' '
  8.         echo $this->var2.' '
  9.     } 
  10.     public static function t2() 
  11.  { 
  12.         self::$var1+=2; 
  13.         echo self::$var1.' '
  14.     } 
  15. $t=new TestC(); 
  16. $t->t1(); 
  17. TestC::t2();  
  18. ?> 

const

1.const只能修饰成员属性

2.类中使用const声明常量

3.用法类似定义一般常量

4.访问方式和静态成员是一样的(在类外 类名::常量名,类内 self::常量名)

5.常量一定要在声明时就给初值

语法:const cOnstant= "value";

例子代码如下:

  1. Class Person{ 
  2.     // 定义常量 
  3.     const country = "中国"
  4.     public function myCountry() { 
  5.         //内部访问常量 
  6.         echo "我是".self::country."人"
  7.     } 
  8. // 输出常量 
  9. echo Person::country.""
  10. // 访问方法 
  11. $p1 = new Person(); 
  12. $p1 -> myCountry(); 
  13. ?> 

运行该例子输出:

中国

我是中国人

PHP中小常用魔术方法:

__call()   在调用对象中不存在的方法时,就会调用此方法。就会出现系统报错,然后程序会退出。声明此方法来对错误进行操作,阻止程序崩溃。

__toString()   直接输出对象引用时调用,用来快速获取对象的字符串表示的最便捷的方式,代码如下:

  1. // Declare a simple class 
  2. class TestClass 
  3.     public $foo
  4.     public function __construct($foo)  
  5.     { 
  6.         $this->foo = $foo
  7.     } 
  8.     public function __toString() { 
  9.         return $this->foo; 
  10.     } 
  11. $class = new TestClass('Hello'); 
  12. echo $class
  13. ?> 

void __clone(void)

当复制完成时,如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调用,可用于修改属性的值(如果有必要的话),代码如下:

  1. class SubObject 
  2.     static $instances = 0; 
  3.     public $instance
  4.     public function __construct() { 
  5.         $this->instance = ++self::$instances
  6.     } 
  7.     public function __clone() { 
  8.         $this->instance = ++self::$instances
  9.     } 
  10. class MyCloneable 
  11.     public $object1
  12.     public $object2
  13.     function __clone() 
  14.     { 
  15.        
  16.         // 强制复制一份this->object, 否则仍然指向同一个对象 
  17.         $this->object1 = clone $this->object1; 
  18.     } 
  19. $obj = new MyCloneable(); 
  20. $obj->object1 = new SubObject(); 
  21. $obj->object2 = new SubObject(); 
  22. $obj2 = clone $obj
  23.  
  24. print("Original Object:\n"); 
  25. print_r($obj); 
  26. print("Cloned Object:\n"); 
  27. print_r($obj2); 
  28. ?> 

__autoload()其它的魔术方法都是在类中添加起作用,这个是唯一一个不在类中添加的方法,只要在页面中使用到一个类,只要用到类名就会自动传进此方法,代码如下:

  1. session_start(); 
  2. require_once 'MyClass.php'
  3. $obj = new MyClass; 
  4. $_SESSION['obj'] = $obj
  5. ?> 

运行正常,然后在后续页面加载,代码如下:

  1. session_start(); 
  2. require_once 'MyClass.php'
  3. $_SESSION['obj']->callSomeMethod(); 
  4. ?> 

致命错误:脚本试图执行一个方法或访问一个不完整的对象的属性,请确保对象的类定义“MyClass”你想操作被加载 _before_ unserialize()调用或提供一个__autoload()函数来加载类定义,但是如果你这样做,它将正常工作,代码如下:

  1. require_once 'MyClass.php'
  2. session_start(); 
  3. $_SESSION['obj']->callSomeMethod(); 
  4. ?> 

对象串行化:将一个对象转化为二进制串

1.将对象长时间存储在数据库或文件中时

2.将对象在多个PHP文件中传输时,serialize():参数是一个对象,返回的是一个二进制串   unserialize():参数是对象的二进制串,返回的就是新生成的对象,__sleep()   在序列化时自动调用的方法(serialize)

作用:可以将一个对象部分序列化,只要这个方法中返回一个数据组,数组中有几个成员属性就序列化几个成员属性,如果不加,所有成员属性都被序列化 

__wakeup()   在反序列化时自动调用的方法(unserialize)   也就是对象重新诞生的一个过程

注意事项:PHP把所有以__(两个下划线)开头的类方法当成魔术方法。所以当你定义类方法时,除了上述魔术方法,建议不要以 __为前缀。



推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文是关于C#类型系统、值类型和引用类型的概念性笔记。介绍了C#1系统类型的三个特性,静态类型的含义,显式类型和隐式类型的区别。还讨论了类、结构、数组类型、枚举、委托类型和接口类型属于哪一种类型。同时纠正了关于结构、引用类型和对象传递的错误表述。最后提到了C#4中使用动态类型的关键字。 ... [详细]
  • 本文描述了作者第一次参加比赛的经历和感受。作者是小学六年级时参加比赛的唯一选手,感到有些紧张。在比赛期间,作者与学长学姐一起用餐,在比赛题目中遇到了一些困难,但最终成功解决。作者还尝试了一款游戏,在回程的路上感到晕车。最终,作者以110分的成绩取得了省一会的资格,并坚定了继续学习的决心。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
author-avatar
烧饼来一个则_815
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有