php中self和static的区别是什么

phpselfstatic的区别:self只能引用当前类(current class)中的方法,而static允许函数调用在运行时绑定调用类(calling class)中的方法。

php中self和static的区别是什么

本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑

php中self与static的区别

通过一些示例,我们可以很容易看出self和static的区别。假定我们有class Car – 它有两个方法,model和getModel。注意,这里我们使用了关键字self。

class Car{    public static function model()    {         self::getModel();    }    protected static function getModel()    {        echo "I am a Car!";    }}

登录后复制

调用静态方法

Car::model();

登录后复制

得到输出

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

I am a Car!

登录后复制

关键字self使得我们调用了class Car的getModel方法,输出了文本“I am a Car!”。

下面我们添加一个新的类,class Mercedes, 它继承自class Car,代码如下:

class Mercedes extends Car{    protected static function getModel()    {        echo "I am a Mercedes!";    }}

登录后复制

当我们调用Mercedes::model()时,猜猜结果是什么?
可能你觉得结果会是:

I am a Mercedes!

登录后复制登录后复制

但实际输出是:

I am a Car!

登录后复制

这是为什么呢?

对于self的解释

关键字“self”的工作原理是:它会调用当前类(current class)的方法。因为model方法只在class Car中定义的,所以对它来说当前类就是class Car。model中的self::getModel(),调用的自然也就是class Car中的getModel方法。

这个行为似乎不是我们想要的,它不符合面向对象的设计原则。如何解决呢?可以使用关键字static。

static关键字和延迟静态绑定(late static binding)

在PHP5.3中,加入了一个新的特性,叫做延迟静态绑定。它可以帮我们实现多态,解决上面的问题。简单来说,延迟静态绑定意味着,当我们用static关键字调用一个继承方法时,它将在运行时绑定调用类(calling class)。在上面的例子中,如果我们使用延迟静态绑定(static),意味当我们调用“Mercedes::model();”时,class Mercedes中的getModel方法将会被调用。因为Mercedes是我们的调用类

延迟绑定的例子

class Car{    public static function model()    {         static::getModel();    }    protected static function getModel()    {        echo "I am a Car!";    }}

登录后复制

我们只是将class Car中的self替换成了static,并未对class Mercedes作修改。

现在我们调用

Mercedes::model();

登录后复制

得到输出

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

I am a Mercedes!

登录后复制登录后复制

php 5.3以下的版本无法使用延迟静态绑定

注意,php 5.3之前的版本无法使用延迟静态绑定。如果尝试在php 5.3以下的版本运行上面的例子,将会报错。

php中的self和static

现在我们将例子中的self用static替换,可以看到,两者的区别在于:self引用的是当前类(current class)中的方法,而static允许函数调用在运行时绑定调用类(calling class)中的方法。

推荐学习:《PHP视频教程》

以上就是php中self和static的区别是什么的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2516168.html

(0)
上一篇 2025年3月5日 15:50:13
下一篇 2025年3月1日 02:24:01

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • php怎么将string转为double浮点类型

    转换方法:1、使用强制类型转换,在要转换的string变量之前加上用括号括起来的目标类型“(double)”即可,例“(double)”23.2535″”;2、使用doubleval()函数,语法“doubleval…

    2025年3月5日
    200
  • php中for和foreach的区别是什么

    区别:1、for需要先知道数组长度再操作,foreach不需要;2、foreach效率比for高很多;3、foreach直接通过结构体中next指针获取下一个值,而for循环需要根据key先进行一次hash才得到值。 本教程操作环境:win…

    2025年3月5日
    200
  • php中foo()和@foo()的区别是什么

    php中“foo()”和“@foo()”的区别:“@foo()”是错误控制输出,其所有错误会被忽略,“foo()”是正常调用输出。“@”是错误抑制符,当放在一个php表达式之前,该表达式的所有错误报告会被忽略。 本教程操作环境:window…

    2025年3月5日
    200
  • php怎么删除一行记录

    php删除一行记录的方法:1、修改数据库连接用户名密码与数据库名称以及数据表名;2、通过“function del(id){…}”方法删除一行记录即可。 本文操作环境:windows7系统、PHP7.1版,DELL G3电脑 p…

    2025年3月5日
    200
  • ie无法打开php怎么办

    ie无法打开php的解决办法:1、添加环境变量;2、配置PHP.INI;3、开启Web服务扩展;4、编写正确的PHP文件;5、重启WEB服务。 本文操作环境:windows7系统、ie11&&PHP7.1版,DELL G3电…

    2025年3月5日
    200
  • php runtime 不可写怎么办

    php runtime不可写的解决办法:首先用终端进入你的服务器;然后找到当前的目录;最后执行“chmod 777 -R Runtime”命令即可。 本文操作环境:windows7系统、thinkphp v6版,DELL G3电脑 具体问题…

    2025年3月5日
    200
  • php css不加载怎么办

    php css不加载的解决办法:首先打开HTML文档;然后在head标签中找到引入css文件的link标签;最后在link标签的href属性的值前面加上“__STATIC__”即可。 本文操作环境:windows7系统、PHP7.1&amp…

    2025年3月5日
    200
  • php zip扩展安装教程

    php zip扩展安装方法:首先安装libzip;然后通过“make install”安装zip;接着打开“php.ini”文件;最后将“;extension=zip”改成“extension=zip”即可。 本文操作环境:centOS6.…

    2025年3月5日 编程技术
    200
  • php怎么获取当月第几天

    php获取当月第几天的实现方法:首先新建一个php文件;然后使用header()方法将页面的编码格式设置为utf-8;接着定义一个变量;最后使用“date()”函数获得当前属于这个月的第几天即可。 本文操作环境:windows7系统、PHP…

    2025年3月5日 编程技术
    200
  • iis7 php 中文乱码怎么办

    iis7 php中文乱码的解决办法:首先打开相应的PHP文件;然后在文件的开头写上“header(‘Content-type: text/html; charset=UTF8’);”即可。 本文操作环境:window…

    2025年3月5日
    200

发表回复

登录后才能评论