PHP 中的 __call、__callStatic 和调用范围

2024-02-03

我最近读到有关在 PHP 中调用作用域和作用域解析运算符 (::) 的内容。有两种变体:实例调用和静态调用。考虑以下听力:

<?php

class A {
    public function __call($method, $parameters) {
        echo "I'm the __call() magic method".PHP_EOL;
    }

    public static function __callStatic($method, $parameters) {
        echo "I'm the __callStatic() magic method".PHP_EOL;
    }
}

class B extends A {
    public function bar() {
        A::foo();
    }
}

class C {
    public function bar() {
        A::foo();
    }
}

A::foo();
(new A)->foo();

B::bar();
(new B)->bar();

C::bar();
(new C)->bar();

执行结果(PHP 5.4.9-4ubuntu2.2)为:

I'm the __callStatic() magic method
I'm the __call() magic method
I'm the __callStatic() magic method
I'm the __call() magic method
I'm the __callStatic() magic method
I'm the __callStatic() magic method

我不明白为什么(new C)->bar();执行__callStatic() of A?实例调用应该在 bar() 方法的上下文中进行,不是吗?这是PHP的特性吗?

补充1:

此外,如果我不使用魔术方法并显式调用,一切都会按预期工作:

<?php

class A {
    public function foo() {
        echo "I'm the foo() method of A class".PHP_EOL;
        echo 'Current class of $this is '.get_class($this).PHP_EOL;
        echo 'Called class is '.get_called_class().PHP_EOL;
    }
}

class B {
    public function bar() {
        A::foo();
    }
}

(new B)->bar();

结果:

I'm the foo() method of A class
Current class of $this is B
Called class is B

In the bar()中的方法C, 你有A::foo();:

public function bar() {
    A::foo();
}

由于此方法既不创建实例A,也不C extend A, the ::运算符被视为尝试调用静态方法的静态运算符A::foo()。因为foo()没有定义于A,它会回落到__callStatic() method.

如果你想让它调用非静态方法而不扩展A,你必须创建一个实例A:

class C {
    public function bar() {
        $aInstance = new A();
        $aInstance->foo();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 中的 __call、__callStatic 和调用范围 的相关文章

  • 严格标准:资源 ID#73 用作偏移量,转换为整数

    我使用这个 PHP 函数获取 MySql 结果 function fetcharray query id if query id query id this gt query res if query id this gt q array
  • PHP 文件由浏览器下载,而不是由本地开发服务器(MAMP)处理

    一切都很顺利 直到我添加AddHandler application x httpd php5s php到本地服务器文档根目录中的 htaccess 文件 根据我正在使用的站点 我经常更改该文件 因为我访问时这样做了http 本地主机 88
  • 附加之前检查数据库中是否存在 ID

    我通过选择一个带有类别的数组json decode并将它们附加到文章中 public static function setArticleCategory Request request article Article where id r
  • 精简 PHP 和 GET 参数

    我使用 Slim PHP 作为 RESTful API 的框架 如何在 Slim PHP 中从 URL 获取 GET 参数 例如 如果我想使用以下内容 http api example com dataset schools zip 999
  • WordPress 计划事件未在设定时间触发

    在 WordPress 中 我正在创建一个插件 用于向用户发送电子邮件 为此 我使用 WordPresscron工作 所以基本上它要做的就是每小时向用户发送电子邮件 所以我的代码看起来像这样 public function construc
  • 在 PHP 中验证约 400MB 的大型 XML 文件

    我有一个很大的 XML 文件 大约 400MB 在开始处理之前我需要确保它的格式正确 我尝试的第一件事是类似于下面的内容 这很棒 因为我可以找出 XML 是否格式不正确以及 XML 的哪些部分 不好 doc simplexml load s
  • 命令运行时从 shell_exec 命令获取输出

    我正在编写一个 PHP 脚本网页 该网页旨在接受先前上传到服务器的 JFFS2 图像的文件名 然后 该脚本将使用映像重新刷新服务器上的分区 并输出结果 我一直在用这个 tmp shell exec update flash v filena
  • 如何在MySQL选择查询中编写正则表达式?

    我尝试过这个表达 b word w b i比较一个word对照其他单词列表来查找重复项 我用了preg math all 效果很好 我想做同样的事情 但这次检查从 mysql 数据库检索到的单词 这是我写的 SELECT FROM tabl
  • 用于添加和删除客户名称的 Web 表单出现问题

    我正在尝试创建一个 Web 表单 其中列出了所有客户 然后为您提供一个文本字段 旁边有一个按钮 您可以在其中添加客户 然后它应该显示客户列表 旁边有删除按钮 您可以单击该按钮从数据库中删除客户 我正在让它发挥作用 对于初学者来说 它会回显
  • 安全转义表名/列名

    我在 php 中使用 PDO 因此无法使用准备好的语句转义表名或列名 以下是我自己实现它的万无一失的方法 tn str replace REQUEST tn column str replace REQUEST column sql SEL
  • 使用 Jquery Easyui 将数据网格导出到 Excel

    我是 json 新手 我使用 php 从 mysql 表生成了 jason 数据 并希望将生成的 json 导出为 xls 格式 考试导出 php
  • YouTube 频道 URL 的正则表达式

    如何使用 REGEX 验证 YouTube 频道 URL 我发现了这个模式 但它不能正常工作 http https www youtube com channel user a zA Z0 9 1 谁能帮我 你的问题是之后的额外管道user
  • PHP 计数器在 while 循环中递增

    我在一个 while 循环中增加计数器时遇到问题 基本上我只想在数据库中获取的两个图像链接之间交替 但我的计数器不会增加 我不确定为什么有人可以提供帮助 while row stmt gt fetch PDO FETCH ASSOC img
  • 使用 Laravel Fluent 查询生成器从多个表中进行选择

    我正在重写一些 PHP MySQL 来与 Laravel 一起使用 我想做的一件事是使数据库查询更加简洁使用 Fluent 查询生成器 http laravel com docs database fluent但我有点迷失 SELECT p
  • 更新查询增量字段加上 1 codeigniter 函数 [重复]

    这个问题在这里已经有答案了 我想在 codeigniter 项目中将字段值增加到当前值加 1 所以 我做了一个功能 但它不起作用 我的职能是 function increse field by 1 table name fieldToInc
  • 为什么 http://localhost/ 不使用 WAMP 加载任何内容?

    我最近尝试安装 WAMP 但发现没有页面加载 它还有一个橙色的 W 标志 如果这有什么意义的话 它确实说 托盘图标 WAMP服务器已上线尽管 我也做了一些研究 发现 Skype 可能会引起问题 所以我删除了使用端口 80 和 443 作为传
  • Symfony 5.4 Security Bundle,注册后无法登录

    我在 5 4 版本上构建空的新项目 我使用这些命令来构建项目 composer create project symfony skeleton 5 4 testapp54 cd testapp54 composer require weba
  • 使用 PHP 和 jSON 从 MySQL 获取 UIImage

    我正在开发一个小型新闻阅读器 它通过对 URL 执行 POST 请求来从网站检索信息 响应是一个带有未读新闻的 JSON 对象 例如 应用程序上的最新新闻的时间戳为 2013 03 01 当用户刷新表时 它会发布 domain com ap
  • 重定向到另一个文件夹

    我读了这个 htaccess 重写以将根 URL 重定向到子目录 https stackoverflow com questions 990392 htacces rewrite to redirect root url to subdir
  • Woocommerce 中的 Ajaxify 标头购物车项目计数

    我正在为 WordPress 创建一个自定义 woocommerce 集成主题 我在顶部有一个 blob 显示购物车中的商品总数 我想使用 Jquery 更新此 blob 无需重新加载页面 我能够通过获取购物车中的当前数量来增加商品数量bl

随机推荐

  • 使用 在从 XSL FO 生成的 PDF 中插入换行符

    我正在使用 XSL FO 生成一个包含信息表的 PDF 文件 其中一列是 描述 列 我填充这些描述字段之一的字符串示例如下 This is an example Description br List item 1 br List item
  • 如何访问手机照片库中的图像?

    顺便问一下 有人知道如何访问手机的照片库吗 我正在制作一个应用程序来拍摄植物叶子的照片 分析图像以确定其是否已确定 我们希望我们 可以为用户提供两种选择 拍摄叶子的照片或使用植物的图像 用户已经拿走的叶子 然而 我们拍了照片 但我们没有 知
  • 使用 Spring AOP 进行方法分析(基本执行时间)

    我正在寻找一种功能或软件 它可以让我轻松地分析我的方法执行时间并选择通过包过滤器分析的内容 我知道 它是探查器 101 我使用 TPTP 分析器 但我对此并不满意 坦率地说 我只是不明白它是如何工作的 当我分析我的应用程序 以分析模式启动服
  • xpath:查找不同行中具有相同位置的表格单元格

    我正在解析一个包含如下结构的网页 tr td Label 1 td td Label 2 td td Label 3 td td Something else td lt tr gt tr td Item 1 td td Item 2 td
  • 什么是 {block:Hidden} 以及何时使用它?

    block Hidden
  • htaccess 获取不带路径的文件名

    我正在尝试获取所请求的不带路径的文件名使用 htaccess 作为 RewriteCond REQUEST FILENAME返回完整的绝对路径 但我只需要文件名 例如test php 我一直在寻找这个很多 但找不到任何可以帮助我的东西 感谢
  • Webdeploy权限问题

    我有 3 个 Web 部署 Visual Studio 将项目发布到包 包 我使用 msdeploy 命令与服务器同步 其中一个包是新添加的 除了新添加的包之外 其他两个包都工作正常 我在日志中看到以下错误 我不确定在哪里设置此权限 因为
  • TCP - 接收顺序错误

    是否有可能以错误的顺序 由序列号指示 获取 TCP 数据包 那么接收方会发生什么 例如 是否有任何队列容纳 太早 到达的口袋 或许 接收 TCP 引擎对于要做什么有多种选择 它唯一不能做的就是将这些无序数据包中的数据无序地传递到接收进程 接
  • 表 MYSQL 的密钥文件不正确

    当我想按查询分组时 我收到此错误消息 Incorrect key file for table tmp sql 623d 0 MYI try to repair it 它是一个 InnoDB 表 有 3 000 000 条记录 大小为 4
  • PHP 的设计模式 - 访问者模式与仆人模式

    我发现这两种模式很相似 以及大多数其他行为模式 访客模式 interface Visitor public function visit Visitable Visitable interface Visitable public func
  • java.lang.ClassCastException:org.ksoap2.serialization.SoapPrimitive?

    我正在从我的 Android 客户端应用程序调用 Web 服务 当我尝试显示它时得到响应后 我收到 ClassCastException 以下是我的代码 public void onClick View v setContentView R
  • mysql_insert_id 使用安全吗?

    根据 PHP 文档 mysql insert id从 mysql 表中获取最后插入的 id 我的问题是 如果我有一个网站每秒向数据库插入超过 2 行 我可以使用mysql insert id并获取我在中提到的正确 IDINSERT查询之前的
  • Redis“客户端列表”用途和说明

    在执行 客户端列表 时 我得到以下结果 每个标志的含义是什么 奴隶 addr 100 0 0 0 0000 fd 5 空闲 3 标志 S db 0 sub 0 psub 0 qbuf 0 obl 0 oll 0 事件 r cmd sync
  • 签名板和 dompdf

    我在用托马斯 J 布拉德利的插件 http thomasjbradley ca lab signature pad 用于在 html 表单底部绘制两个签名 然后使用 dompdf 将其转换为 pdf 并使用 sendmail 作为附件通过电
  • Cumulocity smarREST 响应模板

    我正在尝试设置 Cumulocity smartREST 响应模板以提供应用程序存储的设备对象的信息 我认为这是不可能的 但我想确认一下 因为文档很简短而且不清楚 我之前已经成功实现了测量发布模板 但我现在正在尝试执行库存获取 我已经在设备
  • Delphi 中 JSON 与 XML 解析速度

    我们正在创建一个使用大量 XML 解析的应用程序 我想也许可以使用 JSON 因为我们可以使用 JSON 作为 XML 的替代品 我需要测试 JSON 或 XML 哪个更快 但想先在这里征求意见 JavaScript 中的 JSON 是原生
  • PHP 错误处理适用于 MySQL 和 MySQLi,但不适用于 PDO

    我刚刚将一堆 MySQL 和 MySQLi 表单重构为 PDO 一切似乎都正常 现在开始错误处理 在我一直使用的 MySQL MySQLi 代码中if语句来捕获错误 像这样 if database connection error hand
  • 如何减小我从 keras 转换的 .tflite 的大小

    我刚刚转换了一个Keras model h5 resnet50 img classify 在谷歌上创建COLAB to tflite但尺寸只是减小了0 5 MB 这是针对移动应用程序的 大小应该进一步减小 它大约有 90MB 对于生产来说太
  • 使用 jQuery 根据原始值修改每个文本字段的值

    是否可以使用 jQuery 或 JavaScript 根据原始值修改网页中存在的每个文本字段的值 例如 假设一个页面中有 50 个文本字段 我想删除每个文本字段值的开头和结尾的空格 我认为单独为每个文本字段调用该函数并不是一个好主意 如何在
  • PHP 中的 __call、__callStatic 和调用范围

    我最近读到有关在 PHP 中调用作用域和作用域解析运算符 的内容 有两种变体 实例调用和静态调用 考虑以下听力