【问题标题】:Calling an Abstract method from parent abstract class从父抽象类调用抽象方法
【发布时间】:2012-05-05 12:07:03
【问题描述】:

看了this question之后,我自己尝试了选择的答案! 所以基本上我写的是`

abstract class person
{

  function __construct()
  {
    // some code here
  }

  function myfunc()
  {
    $this->test();
  }

  abstract function test();
}

class employee extends person
{
  function __construct()
  {
    parent::__construct();
  }

  function test()
  {
    echo "So you managed to call me !!";
  }

}


$employee = new employee();
$employee->myfunc();`

当我运行这个脚本时,我遇到了一个常见的错误 致命错误:在第 7 行不在对象上下文中时使用 $this。

那么,如何从父类中调用摘要?

  • 编辑

我真正想做的是创建一个 DatabaseObject 类,它包含不同数据库对象的所有常用方法,并使类扩展它。

abstract class DatabaseObject {
   abstract protected function getTableName();

   public static function find_by_id($id = 0){
        global $database;
        $class = get_called_class();

        $result_array = self::find_by_sql("SELECT * FROM ". $this->getTableName() ." WHERE _id = {$id} LIMIT 1");
        echo $result_array . "<br />";
        return !empty($result_array) ? array_shift($result_array) : false;
    }

    public static function find_by_sql($sql=""){
        global $database;
        $result_set = $database->query($sql);
        $object_array = array();
        while ($row = $database->fetch_array($result_set)){
            $object_array[] = self::instantiate($row);
        }
        return $object_array;
    }
   }
}

所以这是我的 DatabaseObject 类的一部分。我的用户类如下

class User extends DatabaseObject {
    protected static $table_name = "users";

    protected function getTableName(){
        global $table_name;
        return $table_name;
    }
}

现在,每当我这样做时

$user = new User();
$user->findById(1);

我收到错误 Fatal error: Using $this when not in object context 在指向

的行上
$this->getTableName();

我希望这可能有助于清理一些东西。有什么办法可以做到这一点? 谢谢!

【问题讨论】:

  • 这个错误并不罕见,尤其是当你得到它的时候。它是可预测和可复制的。 -- 顺便说一句,你的代码看起来不错(如果它的唯一工作是调用父构造函数,你可以删除 fish 的构造函数)。
  • @Shobhit,这是你的最终代码吗?
  • @hakre :这只是他展示的一个例子。他想要的是在函数中调用那个抽象方法。
  • @ShaikhFarooque 这只是我想要做的一个例子。我想要的只是从类本身调用一个抽象方法!
  • 我添加了真正的目的和我正在尝试的真正代码。希望这会有所帮助!

标签: php oop class abstract


【解决方案1】:

您的代码示例运行良好,我不明白您的问题Demo

所以你分享的代码不是你所说的错误代码。

【讨论】:

  • @Shobhit:即使有了你的更新,这也没有意义。如果您静态地调用某些您不执行的函数,则会弹出错误。检查你的代码,有一些隐藏的东西。
  • 我正在使用全局将静态变量拉入一个函数,然后返回表名的值。这可能是问题吗?
  • 这可能是因为我使用的是静态函数吗?再次检查我的问题!
  • 是的,这可能会导致这种情况。不要使用静态方法,您通常不需要它们。您使用的全局变量也是如此。如所写,检查我上面在 cmets 中链接的书。
【解决方案2】:

你不能把变量当作类的成员来调用,因为你声明它是静态的。调用静态变量看起来与调用静态函数时一样,使用 :: 运算符。

class User extends DatabaseObject {
    protected static $table_name = "users";

    protected function getTableName(){
        return self::$table_name;
    }
}

【讨论】:

  • 我使用 global 来拉入 table_name。会不会是这个原因?
  • 有趣...可能导致错误,会调查它...但请不要在这种情况下使用全局变量。
  • 不,使用全局变量与错误无关。正如错误消息所说:引用静态变量时不能使用 $this 。要么删除关键字 static,要么使用 self::$table_name
  • 你得到什么错误信息。我发布的代码有效,错误必须来自代码中的其他地方。
【解决方案3】:

第一件事是你不能在同一个类中调用抽象函数。您正在调用 test();在 oops 不允许的 myfunc() 中。

【讨论】:

  • 你能建议我那时我能做什么吗?我已编辑问题以包含我的要求和真实代码。
【解决方案4】:

你不能访问同一个抽象类中的抽象函数。

无论你需要什么,你只需要在子类中调用该方法,抽象超类不会调用子类函数。

编辑:

因为该类中存在函数dosent。

【讨论】:

  • 你能建议我那时我能做什么吗?我已编辑问题以包含我的要求和真实代码。
  • 这不是 PHP 的情况,你可以访问同一个类中的抽象函数。
  • @vic :是的,刚刚执行了程序。非常感谢您的澄清。:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 2016-06-20
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2013-09-17
相关资源
最近更新 更多