【问题标题】:Extended class does not see property of parent Codeigniter扩展类看不到父 Codeigniter 的属性
【发布时间】:2014-03-28 00:54:08
【问题描述】:

我从 jquery ajax 调用 CodeIgniter 控制器方法 -imgupload-。这个控制器扩展了我的自定义前端控制器。

class newad extends My_Controller{

public function __construct() {
    parent::__construct();
}
public function imageupload() {
    $this->load->library("uploadhandler"); 
}

imgupload 方法调用从newad 扩展而来的uploadhandler 类。

class uploadhandler extends newad {

该类的功能正常工作,除了一件事,我无法访问 My_Controller 类的属性,即使它们被声明为受保护。 继承链如下所示:My_Controller->newad->uploadhandler.

知道为什么我无法访问这些属性吗?

【问题讨论】:

  • 为什么需要为库扩展控制器?
  • 我需要知道该库中数据库的用户 ID。用户 ID 存储为前端控制器的属性。

标签: php codeigniter oop


【解决方案1】:

简而言之,答案是您不需要在这里扩展 Controller 类。您可以将值作为参数传递给您的库。

$params = array('user_ud' => $this->userID, 'otehr' => 'other');    
$this->load->library('uploadhandler', $params);

//Now from your library
class uploadhandler{

    public function __construct($params)
    {
        // Do something with $params
    }

   //.. Your code...//
}

现在关于您的问题:

该类的功能正常工作,除了一件事,我无法访问 My_Controller 类的属性,即使它们被声明为受保护。继承链如下所示:My_Controller->newad->uploadhandler。知道为什么我无法访问这些属性吗?

由于继承链没问题,您可以从库中访问 My_Controller 的属性,但不能访问 Current 控制器的值,因为这两个是不同的对象

所以这是我的答案,我们如何访问该值?我已经提到的一种方法。如果您需要与图书馆共享一些财产,这就足够了。但是,如果您需要访问所有 Controller instance 怎么办。有一个函数可以获取控制器实例get_instance()的引用。您可以在任何地方使用此功能并访问所有公共财产控制器。如果您需要访问控制器的任何私有属性,请定义一个 geter 函数来访问它。


说明

首先您需要了解OOP 的基本知识。了解类、对象、继承..

当我说 My_controller 的属性与您从 uploadhandler 访问的同一属性不同时,如果您不熟悉类和对象,可能会感到困惑。这是不同类的两个实例(对象)。 简而言之,假设您有一些类,例如:VehicleCarMachinePerson。它们都有共同的属性,比如 nameweight ..

那么,我们可以从其他类继承任何这些类吗?

简单的答案是否定的。我们不能(!)定义从 Others 扩展的 Person 类。那么我们如何决定哪些不一致是合法的。如果你可以说 Foo 是一个 Bar,那么你可以编写从 Bar 扩展而来的 Foo 类。现在从您的情况来看,很明显 uploadhandler 不是控制器。所以永远不要something 中扩展一个 anything 而不是 something

注意:答案很笼统。如果您需要任何具体的说明,请问,我可以更新我的答案

【讨论】:

  • 谢谢,很好的解释。
猜你喜欢
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多