在 PHP 中实例化类的正确方法

2023-12-22

我正在尝试在类内创建一个方法,它将实例化当前所在的类。但我还需要此方法才能在所有扩展类中正常工作。据我所知这个线程 https://stackoverflow.com/questions/5197300/new-self-vs-new-static,不好用self此任务的关键字。所以显而易见的选择是使用static关键词。

但是,我遇到了同样有效的不同方法。

Example:

class SimpleClass
{
    private $arg;

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

    public function getArg(){return $this->arg;}
    public function setArg($arg){$this->arg = $arg;}

    public function staticInstance()
    {
        return new static( $this->arg );
    }

    public function thisInstance()
    {
        return new $this( $this->arg );
    }

    public function selfInstance()
    {
        return new self( $this->arg );
    }
}

class ExtendedClass extends SimpleClass
{
}

$c1 = 'SimpleClass';
$c2 = 'ExtendedClass';

$inst1 = new $c1('simple');
$inst2 = new $c2('extended');

$static_instance_1 = $inst1->staticInstance();
$this_instance_1 = $inst1->thisInstance();
$self_instance_1 = $inst1->selfInstance();

$static_instance_2 = $inst2->staticInstance();
$this_instance_2 = $inst2->thisInstance();
$self_instance_2 = $inst2->selfInstance();

echo "SimpleClass Instances\n";
echo get_class($static_instance_1);
echo get_class($this_instance_1);
echo get_class($self_instance_1);

echo "ExtendedClass Instances\n";
echo get_class($static_instance_2);
echo get_class($this_instance_2);
echo get_class($self_instance_2);

正如我从这个例子中看到的,两者staticInstance and thisInstance产生“正确”的结果。或者他们有吗?

有人可以解释这两种方法之间的区别以及哪一种是“正确的”方法。


php.net http://www.php.net/manual/en/language.oop5.late-static-bindings.php says:

从 PHP 5.3.0 开始,PHP 实现了一项称为后期静态绑定的功能,该功能可用于在静态继承上下文中引用被调用的类。

更准确地说,后期静态绑定通过存储最后一个“非转发调用”中命名的类来工作。对于静态方法调用,这是显式命名的类(通常是 :: 运算符左侧的类);对于非静态方法调用,它是对象的类。 “转发调用”是一种静态调用,由 self::、parent::、static:: 引入,或者,如果在类层次结构中向上,则由forward_static_call() 引入。函数 get_used_class() 可用于检索带有被调用类名称的字符串,并且 static:: 引入其范围。

从内部角度考虑,此功能被命名为“后期静态绑定”。 “后期绑定”来自这样一个事实:static:: 不会使用定义该方法的类来解析,而是使用运行时信息来计算。它也被称为“静态绑定”,因为它可用于(但不限于)静态方法调用。

自我的局限性:

对当前类的静态引用,如 self:: 或CLASS使用函数所属的类来解析,如定义它的位置:

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();
?>

上面的例子将输出:A

后期静态绑定的用法:

后期静态绑定试图通过引入一个引用最初在运行时调用的类的关键字来解决该限制。基本上,这是一个允许您从上一个示例中的 test() 引用 B 的关键字。决定不引入新的关键字,而是使用已经保留的 static。

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // Here comes Late Static Bindings
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();
?>

上面的例子将输出:B

$this关键字引用当前对象,不能在静态方法中使用它。当你说return $this这意味着某个方法返回调用它的同一对象。

所以正确的方法是使用static关键字因为如果你说return new static()它指的是该方法当前所在的类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PHP 中实例化类的正确方法 的相关文章

  • 垃圾邮件打败了我所有的验证码

    我有一个 WordPress 博客 我在上面使用验证码插件的时间最长 因为它有效 最近我收到了大量的垃圾邮件 然后我尝试执行通过 PHP 生成的 将这些随机数添加在一起 但仍然没有成功 我不太确定需要做什么来阻止这些垃圾邮件 但这很烦人 我
  • 将 OAuth WRAP 访问令牌直接保存在客户端计算机上的 cookie 中吗?

    我计划建立一个可以访问 oauth 包装框架的网站 我正在考虑将访问令牌按原样存储在客户端计算机上 我不想在服务器上维护临时令牌等数据库 我应该做吗 或者我应该加密它 首先 为什么他们不使用 OAuth 2 0 您可以将 OAuth 凭据存
  • 如何仅删除页面的自动段落格式,而不删除帖子的自动段落格式(WordPress)

    我已经熟悉这个在 WordPress 中删除自动段落格式的小技巧 remove filter the content wpautop remove filter the excerpt wpautop 但是添加这个函数 php删除整个网站的
  • php中的$$是什么意思? [复制]

    这个问题在这里已经有答案了 变量后面的两个背对背 是什么意思 像这样 id 我在哪里可以找到更多相关信息 谢谢 In PHP 意味着您将给至少一名维护程序员带来多年的痛苦和折磨 请注意 您最终可能会成为维护程序员 它是一个可变变量 想象一下
  • xdebug.remote_handler 在 PHP.INI 中设置,但未在 PHPinfo 中显示

    我正在尝试让 Xbdebug 与 NetBeans 一起运行 以便调试一些 PHP 代码 我确信几年前我已经让它工作了 然后切换了 IDE 现在想切换回来 When I try to debug the status bar shows 并
  • 在laravel中组合两个不同的无关系数据库表查询进行分页

    我的数据库中有两个不相关的表 我需要将它们合并 以便我可以将其放在我的搜索视图中 但我不知道是否可能 这是我的代码 这news and season表不相关 但它们具有相似的列 我试图将其放入一个对象中以便于分页 是否可以 search r
  • 解析错误:语法错误,意外的 T_RETURN [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 遇到这个问
  • Zend Framework 中的动态默认模块

    有谁知道在 Zend Framework 中动态设置默认模块并且不会遇到命名空间问题的方法 例如 我想要做的是有一个允许加载的模块表 其中一个设置为默认模块 例如 我可能有 admin blog calendar 作为可以加载的模块 如果我
  • Facebook iFrame 应用程序 - 摆脱垂直滚动条?

    我已经转换了一个 Facebook 应用程序 http apps facebook com video preferans 从 FBML 到 iFrame 使用 PHP SDK 现在显示的垂直滚动条与我之前显示的内容数量相同 一个徽标 一个
  • 从 php 到 JavaScript 的数组

    我正在尝试使用 json 将数组列表从 php 传输到 javascript 但它不起作用 JS ajax url getProfilePhotos php type post post or get method data if you
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • PHP-docker容器中的环境变量

    我想在我的 docker 容器中显示一个环境变量 PHP 脚本如下所示 我使用 OpenShift 来启动容器 PHP 容器显示 env is 现在我更改容器的 dc 配置 oc env dc envar USER Pieter deplo
  • php oracle客户端oci8安装出现什么问题

    我尝试了安装 PHP Oracle 客户端的所有过程 1 我安装了客户端版本8和32位 2 我在php ini中取消了oci的注释 3 重新启动Wamp 4 不确定是否真的安装 但我在 php ini 中得到了引用 5 但仍然无法连接 泰汉
  • 使用 yum 和 pear 安装 php-soap 均失败

    我正在尝试在 Centos 6 4 服务器上安装 PHP 的 SOAP 扩展 我对包管理器 从 CLI 安装包并在 PHP 中配置它们相当不熟悉 我相当有能力管理 php ini 和其他 PHP 配置文件 soap ini 等 我尝试使用以
  • Paypal 将钱从一个帐户转移到另一个帐户

    我知道这个建议如何汇款至任何 PayPal 账户 https stackoverflow com questions 1559808 paypal api send money to any paypal account但到目前为止我所尝试
  • 扩展构建器中的“映射到现有表”显示 TYPO3 中的奇怪问题

    在我的扩展中MyExt 我映射了模型Page to pagesTYPO3 中的表 首先它向我展示了type mismatch错误 无论如何我继续保存它 会发生以下情况 我的页面树变成这样 我的新记录表单仅显示 UID 而不显示标题 My P
  • php date_parse("2010 年 2 月") 给出日期 == 1

    当没有日期时 我将其称为 date parse 中的错误 d date parse Feb 2010 会给 d day 1 请参阅对此的评论date parse 手册页 http php net manual en function dat
  • 设置大型电子邮件通知系统有哪些方法?

    我的公司有一个用 PHP 构建的网站 我们使用内置的 PHP 电子邮件功能每天向订阅者发送数千封电子邮件 这是一个糟糕的主意 它堵塞了我们的服务器 并且需要几个小时才能完成整个批次 现在我已经研究过像 MailChimp 这样的群发邮件服务
  • PHP 共享标头而不使用服务器端脚本?

    到目前为止我总是通过 PHP 解决简单的问题 您有一个包含页眉 菜单 页脚和内容字段的网站 每个页面的页眉 菜单和页脚通常是相同的 在没有 PHP 或任何其他服务器端语言的情况下 如何使页眉 菜单和页脚数据仅存在于一个文件中 例如 您不会有
  • 禁用 WooCommerce 手动/编辑订单的电子邮件通知

    需要 WooCommerce 专业知识 我需要禁用手动创建的订单的电子邮件通知 我必须使用处理状态 由于处理订单状态的自定义挂钩 我无法创建自定义状态 理想情况下 手动订单页面中可以勾选一个复选框 勾选后 它将禁止在每种状态下向客户发送电子

随机推荐

  • Shell 脚本 If [ -f ./file ]

    我正在自学 shell 脚本 我正在研究如何执行 If 但我不明白一个例子 if f NAME tar then do something else something else 现在我做了一些实验 我给 NAME 提供了我目录中的一个文件
  • 使用 SimpleXMLElement 从对象获取数组

    我在获取这些对象中的数组时遇到一些问题 当我 print r 时 会打印以下代码 message object 是对象的名称 SimpleXMLElement Object header gt SimpleXMLElement Object
  • 在 iOS 中绘制多点路线

    我正在尝试在提供的地图应用程序中显示具有多个点的路线 我已经弄清楚如何显示以下两点之间的路线这个帖子 https stackoverflow com q 4609340 620197 我正在建立以下多个点的列表这些方向 http mapki
  • 从旋转的 UIImageView 创建 UIImage

    我有一个 UIImageView 里面有一张图片 我在显示之前通过将 UIImageView 的变换属性设置为 CGAffineTransformMakeRotation angle 来旋转图像 其中 angle 是以弧度为单位的角度 我希
  • 从 LAN 网络中的另一台 PC 访问 Wamp 2.5 phpmyadmin

    我可以从另一台电脑访问 wamp localhost 但是从这台电脑访问 phpmyadmin 时我无法访问如下图 在 WAMPServer 上 配置了 phpMyAdmin 工具 以便除了运行 WAMPServer 的 IP 之外 无法从
  • 如何使用 Angular 的 ngFor 实现项目重新排序/随机播放动画?

    Vue 用户很容易实现这样的 item shuffle 动画 请参阅他们的官方文档 我搜索了很多 但找不到适合 Angular 用户的解决方案 ngFor似乎在洗牌时切换项目内容而不是移动项目 这是我的演示 http embed plnkr
  • 在 PHP 中获取给定一周的开始天和结束天

    我正在尝试使用星期日作为开始日期和参考日期来获取周范围 例如 date 但我似乎无法弄清楚 例如 如果 date 为 2009 05 01 我将得到 2009 04 26 和 2009 05 02 2009 05 10 将产生 2009 0
  • ember 中具有多个步骤的手风琴向导

    我正在使用 ember 构建一个 巫师手风琴 基本上我想要的是 始终显示的手风琴 手风琴包含所有步骤 一个步骤处于活动状态 但也可能更改先前步骤的标题 每个步骤都有自己的模型 例如 第一步从国家 地区中选择 第二步从产品中选择 应该可以在步
  • UIView autoresizingMask问题

    在 iPad 中 我有一个 UIViewController 里面有另一个 UIview 位于底部 UIView Controller X UIView 是 X 我在 UIViewController 的 viewDidLoad 上为其定义
  • 数据库设计中的多对多关系

    我目前有一个数据库 其中有两个表 分别称为 Articles 和 Tags 为了允许文章属于多个类别 我有多对多的关系 这样的设计从性能上来说是不是一个错误呢 或者我应该删除这两个表之间的关系并添加第三个表作为桥梁 articlesTags
  • 如何在单击按钮时通过动画显示视图?

    我是编码新手 我正在制作一个应用程序 我需要在单击按钮时显示一个视图 并且该视图应该看起来像是来自按钮本身 再次单击该按钮时 视图应返回到按钮 动画 我有翻转 卷曲等动画 但我不知道该怎么做 这是一个简单的例子 放showView 作为按钮
  • 如何访问django项目之外的目录文件?

    我的 Django 项目在 RHEL 7 操作系统上运行 项目在路径中 root project 项目托管在 httpd 服务器上 现在我正在尝试访问目录之外的文件 例如 root data info test txt 我应该如何访问vie
  • 如何在 JSF 2 中创建自定义转换器?

    我有一个名为 操作 的实体 Entity Table name operation public class Operation implements Serializable private static final long seria
  • 如何获得值的二进制表示形式[重复]

    这个问题在这里已经有答案了 可能的重复 C 中十进制到二进制的转换 https stackoverflow com questions 2954962 decimal to binary conversion in c 我有 3 432 1
  • site.css 不适用于我的示例网站

    这里是新手 我在 VS2010 中创建了一个空的 MVC 项目 并且正在尝试格式化我的视图以进行身份 验证 所以 我将其添加到 site css 中 rez color Olive 我的看法是 using Html BeginForm di
  • Django 静态文件(css)不起作用

    由于某种原因 我似乎无法包含我的引导 css 文件 我对 Python 和 Django 特别陌生 所以我肯定做错了什么 姜戈 1 9 2 读完后Django 官方解释 https docs djangoproject com en 1 9
  • Bootstrap:如何将按钮放置在输入组旁边

    我无法弄清楚 符合 正确的引导 如何让按钮位于 div 内的输入组旁边 它们需要居中对齐 这就是我想要的样子 这就是正在发生的事情 这是我当前的代码 div div div div
  • Boost变体apply_visitor编译错误

    这个简单的 boost variant 和 boost apply visitor 示例代码 include
  • 为什么通过实例调用静态方法不会给 Java 编译器带来错误?

    我相信你们都知道我的意思 代码例如 Thread thread new Thread int activeCount thread activeCount 引发编译器警告 为什么不是错误呢 EDIT 需要明确的是 问题与线程无关 我意识到在
  • 在 PHP 中实例化类的正确方法

    我正在尝试在类内创建一个方法 它将实例化当前所在的类 但我还需要此方法才能在所有扩展类中正常工作 据我所知这个线程 https stackoverflow com questions 5197300 new self vs new stat