0

我认为我对 Python 和 PHP 等几种语言中的 OOP 基础知识非常熟悉,但在试图弄清楚 CakePHP 在某些情况下发生的事情时我有点困惑。

例如,我在一个名为 TestsController 的控制器中,但我想从另一个控制器(例如 OthersController)中查找数据。我会做这样的事情

$this->loadmodel('Other');
$this->Other->find('all');

我知道 $this 是对你所在类的对象的引用,而 Other 显然是指 OthersController,但究竟什么是 Other?它是某种初始化变量吗?一个东西?还有什么?$this->Other 本身会变成一个对象吗?如果是这样,PHP/CakePHP 是如何做到这一点的,或者它只是 PHP 固有的东西,它只是“知道”这样做。

我发现了这个叫做方法链接的例子,但它看起来像是使用一个对象来调用许多动作。

<?php
class MyClass{
    public $prop1 = "I'm a class property!";
}
$obj = new MyClass;
echo $obj->prop1; // Output the property   
?>

我了解 $obj 您正在访问 $prop1,但是当有 $obj->SomeModel->action() 之类的东西时,CakePHP 中发生了什么?

如果可能,您能否修改那个小的 OOP 示例以模仿 CakePHP 的示例?

4

3 回答 3

1

在您的示例中,$this->loadmodel('Other')填充$this->Other您要求的模型对象。所以你可以把它当作一个典型的对象(调用方法、访问属性等)。你甚至可以这样做:

$this->loadmodel('Other');
$other = $this->Other;
$other->find('all');

$other被分配了对 的引用$this->Other,因此它们的行为完全相同。

至于链接,假设$this->Other->find('all')返回另一个类型的对象ResultSet,并且ResultSet该类具有方法getNumResults()。链接意味着您可以执行以下操作:

echo $this->Other->find('all')->getNumResults();

只要您在链中调用的每个方法都返回另一个对象,您就可以继续调用该对象上的方法。

于 2013-08-13T14:43:25.787 回答
0
$this->loadmodel('Other');
$this->Other->find('all');

我知道 $this 是对你所在类的对象的引用,而 Other 显然是指 OthersController,但究竟什么是 Other?它是某种初始化变量吗?一个东西?还有什么?$this->Other 本身会变成一个对象吗?如果是这样,PHP/CakePHP 是如何做到这一点的,或者它只是 PHP 固有的东西,它只是“知道”这样做。

Other不是指OthersController,它指的是一种Other 模式。Cake 自动加载Other内部命名的模型OthersController(它从它们的名称推断关系),但在任何其他控制器内部$this->Other都不可用,除非您通过$this->loadmodel('Other')首先调用显式加载模型。这就是上面的代码片段所做的。

即使模型是由 Cake 加载的,这仍然是在constructClasses方法中显式完成的(即使它对您是透明的) 。

从模型开始加载的那一刻起,它就可以$controller->ModelName像任何其他对象一样访问。

于 2013-08-13T14:40:41.030 回答
0

添加到 Jon 的回答中,PHP 框架做了很多魔术。

我发现自己正在学习魔法 getter/setter 以及很多类似的东西。

例如,Yii ActiveRecord,数据库中的每一行都是一个对象。

因此,例如,您可以这样做来加载记录:

$user1 = User::model()->findByPk('1');

$user1->name = 'Jorge';
$user1->save;

因此,您需要一段时间才能真正理解框架在做什么。

我敢打赌,当您执行此操作时$this->load->('model');,它会以某种结构(可能是数组)加载模型,并替换魔术 getter/setter ,您实际上可以说,当您执行此操作时,$this->modelName您实际上会执行$this->modelsArray['modelName'].

没有数据验证的示例:

class MyClass
{
  private $arrayExample = array( 'value1'=>123, 'value2'=>234);

  public function __get( $property )
  {
    if( array_key_exists( $this->arrayExample, $property )
      return $this->arrayExample[$property];
    return 'undefined';
  }
}

$class = new MyClass;
echo $class->value1; //outputs 123
echo $class->value0; //outputs undefined
于 2013-08-13T14:52:22.997 回答