从父类访问子类静态变量?

2024-04-07

我有一个基类,我需要调用子类中引用的类上的函数。

足够容易,

class base_class {

    public function doSomethingWithReference(){
        $this->reference->doSomething();
    }
}

class extended_class extends base_class{

    protected $reference;

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

现在显然效果很好,

但是,当我调试时,我并不关心$this->reference

但是,该对象$this->reference指的是巨大!

所以,当我这样做时print_r($instanceOfExtendedClass)我从那个物体上得到了打印结果。

现在每个扩展类的引用都是不同的base_class.

我想做的只是设定reference作为静态属性extended_class class.

但是,然后改变doSomethingWithReference to be self::$reference抛出未定义变量错误。

相反,设置静态变量base_class并修改它extended_class不起作用,因为它更改了从该类扩展的所有内容的变量。

有什么办法可以做到这一点,这样我就不会打印出来$this->reference?


因为您使用的是 PHP 5.3,所以您可以使用后期静态绑定 http://php.net/language.oop5.late-static-bindings在运行时解决对正确类的静态调用。

class base_class {

    public function doSomethingWithReference(){
        static::$reference->doSomething();
    }

}

class extended_class extends base_class{

    protected static $reference;

    public function __construct($ref){
        static::$reference = $ref;
    }

}

大胖提醒: 那个extended_class::$reference将被共享all of the extended_class实例。如果这不是您想要的,那么这是行不通的。

您似乎实际上担心内存或资源使用。在 PHP 中,所有对象都是通过引用传递的。这意味着将对象作为参数传递或创建它的副本等不会消耗额外的内存。如果需要在多个其他对象中引用一个对象,这样做会not消耗额外的内存。


如果我有扩展类和另一个相同的类(例如扩展类1),他们也会共享引用吗?或者所有的extend_class'实例共享一个引用,而所有的extend_class1'实例将共享另一个引用(理想情况)?

看起来共享是基于静态变量的定义位置的。两个示例,均来自 PHP 交互式提示:

php > class Shared { public $me; public function __construct($me) { $this->me = $me; } }
php > class Base { protected static $ref; public function foo() { echo static::$ref->me, "\n"; } }
php > class Inherit_1 extends Base { public function __construct($ref) { static::$ref = $ref; } }
php > class Inherit_2 extends Base { public function __construct($ref) { static::$ref = $ref; } }
php > class Inherit_3 extends Inherit_1 {}
php > $shared_1 = new Shared(1)
php > ;
php > $shared_2 = new Shared(2);
php > $shared_3 = new Shared(3);
php >
php > $in_1 = new Inherit_1($shared_1);
php > $in_2 = new Inherit_2($shared_2);
php > $in_3 = new Inherit_3($shared_3);
php >
php > $in_1->foo();
3
php > $in_2->foo();
3
php > $in_3->foo();
3

在这种情况下,因为引用位于基类中,所以每个人都会看到相同的引用。我想这有一定道理。

当我们声明每个子类的引用时会发生什么......大多数时候?

php > class Shared { public $me; public function __construct($me) { $this->me = $me; } }
php > class Base { public function foo() { echo static::$ref->me, "\n"; } }
php > class Inherit_1 extends Base { protected static $ref; public function __construct($ref) { static::$ref = $ref; } }
php > class Inherit_2 extends Base { protected static $ref; public function __construct($ref) { static::$ref = $ref; } }
php > class Inherit_3 extends Inherit_1 {}
php > class Inherit_4 extends Inherit_1 { protected static $ref; }
php > $shared_1 = new Shared(1);
php > $shared_2 = new Shared(2);
php > $shared_3 = new Shared(3);
php > $shared_4 = new Shared(4);
php > $in_1 = new Inherit_1($shared_1);
php > $in_2 = new Inherit_2($shared_2);
php > $in_3 = new Inherit_3($shared_3);
php > $in_4 = new Inherit_4($shared_4);
php > $in_1->foo();
3
php > $in_2->foo();
2
php > $in_3->foo();
3
php > $in_4->foo();
4

因为 3 继承自 1,但没有声明它自己的静态属性,所以它继承了 1 的。当我们将 3 设置为 Shared(3) 时,它会覆盖 1 的现有 Shared(1)。

结论:要实现这一点,需要在every需要单个唯一引用的类。请注意,此代码自 5.4.x 起有效。

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

从父类访问子类静态变量? 的相关文章

  • MYSQL 的 Google OAuth 2.0 用户 ID 数据类型

    我正在实施 Google OAuth 2 0 并注意到 Google OAuth 返回的唯一用户 ID 是21位数字长的 我想大整数 20 足以满足这种需求 但我现在看到 Google OAuth 返回的用户 ID 的长度感到困惑 关于我应
  • 压缩 zend Framework 2 的 html 输出

    我目前正在 PHP 5 4 4 上使用 Zend Framework 2 beta 开发个人 web 应用程序以用于自学目的 我想知道是否可以在 html 输出发送到浏览器之前拦截它 以便通过删除所有不必要的空格来缩小它 我怎样才能在ZF2
  • Laravel 5.1 中的VerifyCsrfToken.php 第 53 行:(Firefox 浏览器)中出现 TokenMismatchException?

    我试图找出为什么会出现这个错误 即使它是全新安装的 我在我的项目中遇到了这个错误 所以我用谷歌搜索 没有一个答案对我有用 所以我创建了新项目并复制了所有控制器 视图和模型 几个小时后工作正常 再次出现令牌不匹配错误 为什么在 laravel
  • 在 PHP 中将 CSV 写入不带括号的文件

    是否有本机函数或实体类 库用于将数组写入 CSV 文件中的一行而无需封装 fputcsv将默认为 如果没有为封装参数传入任何内容 谷歌让我失望了 返回一大堆有关的页面的结果 fputcsv PEAR 的库做的事情或多或少与fputcsv 工
  • session_regenerate_id 没有创建新的会话 id

    我有一个脚本 旨在完成当前会话并开始新的会话 我使用了一段代码 它在我的开发计算机上运行良好 但是 当我将其发布到生产服务器时 会话 ID 始终保持不变 以下是我重新启动会话的代码 session start SESSION array P
  • CLSCompliant(true) 拖入未使用的引用

    任何人都可以explain以下行为 总之 如果您创建多个符合 CLS 标准Visual Studio 2008 中的库并让它们共享公共命名空间根 引用另一个库的库将require对该库的引用的引用 即使它不消耗它们 用一句话来解释是相当困难
  • 使用 PHP 将值插入可编辑 PDF,并保持可编辑状态

    我有一个带有可编辑字段的 PDF 我希望将 HTML 表单中的值传递到此 PDF 中 我尝试过使用 FPDF 并且它有效 但是将值传递到 PDF 后 pdf 中的字段不再可编辑 另一个缺点是 在将值传递到 PDF 时 我们必须为每个字段指定
  • 如何在静态方法中获取会话变量的值?

    我正在使用带有 jQ uery 的 ASP NET 页面方法 如何在 C 中的静态方法中获取会话变量的值 protected void Page Load object sender EventArgs e Session UserName
  • strlen()==0 和empty()之间有区别吗?

    我正在查看其他人编写的一些表单验证代码 我看到了这个 strlen 0 当测试表单变量是否为空时 我使用empty 功能 一种方法比另一种方法更好吗 它们在功能上等效吗 strlen是获取字符串中的字符数 同时empty用于测试变量是否为空
  • Sails js 路由静态 html

    我想在我的 sails js 应用程序中完全分离客户端和服务器端 如果我删除 路由 它将自动从 assets 文件夹中提供一个名为index html的文件 我想从资产文件夹中提供另一个文件 我该怎么做 如果你看看 sails 使用的中间件
  • 使用 php 更改白天和黑夜的背景?

    我正在制作一个 tumblr 页面 我的 html 页面有两种不同的背景 我希望白天背景从早上 7 点到晚上 8 点显示 夜间背景从晚上 8 点到早上 7 点显示 我决定用 php 来做这件事 但对于 php 来说我是个新手 我的朋友给我发
  • Composer 用于下载私有 GitHub 存储库

    我无法使用 Composer 下载 github 私人存储库 php composer phar update 我收到以下错误 The https api github com repos company private1 https ap
  • Laravel 5.2 带有可变参数的命名路由用法

    我有这样的路线 Open New Subscription page Route get account subscriptions create menu uses gt Subscriptions SubscriptionControl
  • 静态字符串文字表?

    在 C 中创建全局静态字符串表的正确方法是什么 我所说的 全局 是指 可从包含标头的任何文件中使用 但不是某些运行时创建的单一对象的一部分 我所说的 静态 是指 尽可能少地设置运行时间 只读内存页中的数据 每个应用程序只有 1 个数据实例
  • PHP - hash_pbkdf2 函数

    我正在尝试使用此 php 函数执行一个函数来哈希密码 http be php net manual en function hash pbkdf2 php http be php net manual en function hash pb
  • 在 Woocommerce 购物车中设置最小小计金额

    我正在尝试将最低订单金额设置为 25 美元 到目前为止 我找到了这段代码 如果未达到最低限度 它似乎可以阻止结账 但它使用的小计包含税费 我需要在总计中排除税费 add action woocommerce checkout process
  • 使用 DOJO 自动完成文本框

    我正在寻找一种使用 DOJO 进行文本框自动建议的简单方法 我将查询的数据库表 使用 PHP 脚本 以 JSON 形式返回 有超过 100 000 条记录 因此这确实不应该采用 FilteringSelect 或 ComboBox 的形式
  • 如何从字符串中删除所有数字?

    我想删除字符串 0 9 中的所有数字 我写了这段有效的代码 words preg replace 0 words remove numbers words preg replace 1 words remove numbers words
  • 为什么 PHP 中不允许“传统”类型提示?

    刚刚发现类型提示 http php net manual en language oop5 typehinting phpPHP 中允许 但不适用于整数 字符串 布尔值或浮点数 为什么 PHP 不允许对整数 字符串等类型进行类型提示 从 P
  • mysqli bind_param 中的 NULL 是什么类型?

    我正在尝试将参数绑定到 INSERT INTO MySQLi 准备好的语句 如果该变量存在 否则插入 null 然后我知道 type variable i corresponding variable has type integer d

随机推荐