0

0

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

php中文网

php中文网

发布时间:2016-05-25 16:55:11

|

1287人浏览过

|

来源于php中文网

原创

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

php中常用的关键字

final  

1、final只能修饰类和方法,不能修饰成员属性   作用:使用修饰的类不能被继承,修饰的方法不能被覆盖

PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为

final,则不能被继承。

立即学习PHP免费学习笔记(深入)”;

Example #1 Final 方法示例

 代码如下 复制代码

class BaseClass {
   public function test() {
       echo "BaseClass::test() called\n";
   }
  
   final public function moreTesting() {
       echo "BaseClass::moreTesting() called\n";
   }
}

class ChildClass extends BaseClass {
   public function moreTesting() {
       echo "ChildClass::moreTesting() called\n";
   }
}
// 产生 Fatal error: Cannot override final method BaseClass::moreTesting()
?>
Example #2 Final 类示例

final class BaseClass {
   public function test() {
       echo "BaseClass::test() called\n";
   }
  
   // 这里无论你是否将方法声明为final,都没有关系
   final public function moreTesting() {
       echo "BaseClass::moreTesting() called\n";
   }
}

class ChildClass extends BaseClass {
}
// 产生 Fatal error: Class ChildClass may not inherit from final class (BaseClass)
?>


static 
 
1.使用static可以修饰成员属性和成员方法,不能修饰类  
2.用static修饰的成员属性,可以被同一个类的所有对象共享  
3.静态的数据是存在于内存中的数据段中(初使化静态段)  
4.静态的数据是在类第一次加载时分配到内存中的,后面用到时就可以直接使用了  
5.只要在程序中有这个类名出现,即是类被加载,静态数据就会被分配到内存中了   注:静态的成员都要使用类名访

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

用self代表本类   访问方法 self::静态成员  
6.静态方法不能访问非静态成员,非静态方法可以访问静态成员,因为非静态成员必须用对象来访问,而静态成员不需

例1

 代码如下 复制代码

function test()
{
    static $var1=1;
    $var1+=2;
    echo $var1.' ';
}

test();
test();
test();
?>

例2

例子:

 代码如下 复制代码

Class Person{
    // 定义静态成员属性
    public static $country = "中国";
    // 定义静态成员方法
    public static function myCountry() {
        // 内部访问静态成员属性
        echo "我是".self::$country."人
";
    }
}
class Student extends Person {
    function study() {
        echo "我是". parent::$country."人
";
    }
}
// 输出成员属性值
echo Person::$country."
";  // 输出:中国
$p1 = new Person();
//echo $p1->country;   // 错误写法
// 访问静态成员方法
Person::myCountry();   // 输出:我是中国人
// 静态方法也可通过对象访问:
$p1->myCountry();

// 子类中输出成员属性值
echo Student::$country."
"; // 输出:中国
$t1 = new Student();
$t1->study();    // 输出:我是中国人
?>

运行该例子,输出:

中国
我是中国人
我是中国人
中国
我是中国人


首先,我们知道PHP中调用实例方法都是通过如:someobj->someFun()调用,那么我们调用静态函数是否也能像C#那样

通过SomeClass->someFun()调用呢?答案是否定的,在PHP中,对静态成员的调用只能通过::的方式进行,如:

SomeClass::someFun()。

 

 代码如下 复制代码
class TestC
{
    public static $var1=1;
    public $var2=1;
    function t1()
 {
        self::$var1+=2;
        echo self::$var1.' ';
        echo $this->var2.' ';
    }
    public static function t2()
 {
        self::$var1+=2;
        echo self::$var1.' ';
    }
}
$t=new TestC();
$t->t1();
TestC::t2();
?>

const  
1.const只能修饰成员属性  
2.类中使用const声明常量  
3.用法类似定义一般常量  
4.访问方式和静态成员是一样的(在类外 类名::常量名,类内 self::常量名)  
5.常量一定要在声明时就给初值

语法:

const constant = "value";
例子:

 代码如下 复制代码

Class Person{
    // 定义常量
    const country = "中国";

    public function myCountry() {
        //内部访问常量
        echo "我是".self::country."人
";
    }
}

// 输出常量
echo Person::country."
";

// 访问方法
$p1 = new Person();
$p1 -> myCountry();
?>

运行该例子输出:

中国
我是中国人


PHP中小常用魔术方法:

__call()   在调用对象中不存在的方法时,就会调用此方法。就会出现系统报错,然后程序会退出。声明此方法来对

错误进行操作,阻止程序崩溃。

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

凡诺企业网站管理系统商业版 1.5 试用版
凡诺企业网站管理系统商业版 1.5 试用版

系统优势:  全DIV+CSS模板,多浏览器适应,完美兼容IE6-IE8,以及Firefox Opera 等符合标准的浏览器,模板样式集中在一个CSS文件中,内容与样式完全分离,方便网站设计人员开发模板与管理。系统较为安全,以设计防注入,敏感字符屏蔽。新闻,产品,单页独立关键字设计,提高搜索引擎收录。  调试环境必须为IIS  后台账户密码:admin功能介绍:基本信息设置:网站名称,联系人等信息

下载
 代码如下 复制代码

// Declare a simple class
class TestClass
{
    public $foo;

    public function __construct($foo)
    {
        $this->foo = $foo;
    }

    public function __toString() {
        return $this->foo;
    }
}

$class = new TestClass('Hello');
echo $class;
?>


 

void __clone ( void )
当复制完成时, 如果定义了__clone()方法, 则新创建的对象(复制生成的对象)中的__clone()方法会被调用, 可

用于修改属性的值(如果有必要的话)。

 

 代码如下 复制代码

class SubObject
{
    static $instances = 0;
    public $instance;

    public function __construct() {
        $this->instance = ++self::$instances;
    }

    public function __clone() {
        $this->instance = ++self::$instances;
    }
}

class MyCloneable
{
    public $object1;
    public $object2;

    function __clone()
    {
     
        // 强制复制一份this->object, 否则仍然指向同一个对象
        $this->object1 = clone $this->object1;
    }
}

$obj = new MyCloneable();

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

$obj2 = clone $obj;


print("Original Object:\n");
print_r($obj);

print("Cloned Object:\n");
print_r($obj2);

?>

__autoload()   其它的魔术方法都是在类中添加起作用,这个是唯一一个不在类中添加的方法   只要在页面中使用

到一个类,只要用到类名就会自动传进此方法

 代码如下 复制代码

session_start();
require_once 'MyClass.php';
$obj = new MyClass;
$_SESSION['obj'] = $obj;
?>

Works fine.  Then on a subsequent page load:

 代码如下 复制代码

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

Fatal error:  The script tried to execute a method or access a property of an incomplete object. Please

ensure that the class definition "MyClass" of the object you are trying to operate on was loaded

_before_ unserialize() gets called or provide a __autoload() function to load the class definition.

But if you do this instead, it works fine:

 代码如下 复制代码

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


对象串行化:将一个对象转化为二进制串   1.将对象长时间存储在数据库或文件中时   2.将对象在多个PHP文件中传

输时   serialize():参数是一个对象,返回的是一个二进制串   unserialize():参数是对象的二进制串,返回的就是

新生成的对象    __sleep()   在序列化时自动调用的方法(serialize)   作用:可以将一个对象部分序列化   只要

这个方法中返回一个数据组,数组中有几个成员属性就序列化几个成员属性,如果不加,所有成员属性都被序列化 

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

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

建议不要以 __为前缀。



教程链接:

随意转载~但请保留教程地址★

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

286

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

126

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

42

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

19

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

23

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

421

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

51

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号