【问题标题】:WordPress PHP Extended Classes Refer to 'Wrong' Static VariablesWordPress PHP 扩展类引用“错误”的静态变量
【发布时间】:2015-06-14 15:29:25
【问题描述】:

我有一个 WordPress 插件,它有 2 个扩展类,Area 和 Loc,每个类都有一个辅助函数 Get。每个类都有 table_name 的静态变量。如果我直接调用 Loc::Get($id) ,它会按预期工作。但是,如果我从 Area 调用 Loc::Get($id),它会使用来自 Area 而不是 Location 的 table_name。

谁能解释一下如何纠正这个问题?问候,

class _Base {
    function Get($id) {
        $instance = new self();
        $sql = "SELECT * FROM " . static::$table_name . " WHERE id=$id";
        return $sql;
    }
}

class Area extends _Base {
    static $table_name = "Area";
    function getLoc($id) {
        $sql = Loc::Get($id);
        return $sql;
    }
}

class Loc extends _Base {
    static $table_name = "Loc";
}

$sql = Area::Get(1); // -> "SELECT * FROM **Area** WHERE id=1"

$sql = Loc::Get(1); // -> "SELECT * FROM **Loc** WHERE id=1"

$sql = $area->GetLoc(1); // -> "SELECT * FROM **Area** WHERE id=1"

【问题讨论】:

  • 您想阅读一些关于“后期状态绑定”的内容(有时也简称为“后期绑定”)。对于手头的问题:行为确实有意义:两个派生类都定义了相同的静态变量。在Area 的范围内,该值显然是“区域”。您调用的方法也在Area 类的范围内执行,因此将选择表名,因为该函数访问当前范围内定义的静态变量。
  • 您到底想要什么?另外,您的预期结果是什么,请告诉两者。谢谢
  • @anantkumarsingh 我想说你的两个问题都在上面的 OPs 问题中得到了明确的回答......他希望使用表名“Loc”,但事实并非如此。
  • 作为一种解决方案,您可以将静态变量作为附加参数传递给Get() 方法,或者在每个类中重新定义该方法,或者为该方法实现后期状态绑定。跨度>
  • 您在父类 Base 中的何处声明了 $table_name 变量?

标签: php wordpress static extends


【解决方案1】:

我认为您的问题是您将非静态方法 Get 作为静态运行。当我改变它时,一切都开始正常工作。在下面试试我的代码:

<?php
class _Base {
    static function Get($id) {
        $instance = new self();
        $sql = "SELECT * FROM " . static::$table_name . " WHERE id=$id";
        return $sql;
    }
}

class Area extends _Base {
    static $table_name = "Area";
    function getLoc($id) {
        return Loc::Get($id);
    }
}

class Loc extends _Base {
    static $table_name = "Loc";
}

var_dump(Area::Get(1));
var_dump(Loc::Get(1));
var_dump((new Area)->getLoc(1));

【讨论】:

    【解决方案2】:

    第一

    根据定义,函数 Get 不是静态的 function Get($id) {

    第二个

    $area 未定义

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 2011-03-02
      • 2014-01-07
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      相关资源
      最近更新 更多