首页 > 解决方案 > Joomla JDatabase:selectRowNumber 奇怪使用类属性或方法

问题描述

在 Joomla 3.9.16 中有一个类属性的巧妙使用,该属性也用作方法!

在 library/joomla/database/query.php 中,您可以找到:

protected $selectRowNumber = null;

但是也

public function selectRowNumber($orderBy, $orderColumnAlias)
{
  $this->validateRowNumber($orderBy, $orderColumnAlias);
  $this->select("ROW_NUMBER() OVER (ORDER BY $orderBy) AS $orderColumnAlias");

  return $this;
}

你可以理解为什么要阅读同一个类的这个方法:

protected function validateRowNumber($orderBy, $orderColumnAlias)
{
  if ($this->selectRowNumber)
  {
    throw new RuntimeException("Method 'selectRowNumber' can be called only once per instance.");
  }

  $this->type = 'select';

  $this->selectRowNumber = array(
    'orderBy' => $orderBy,
    'orderColumnAlias' => $orderColumnAlias,
  );
}

当你$this->selectRowNumber()第一次作为一个方法调用时,它调用$this->validateRowNumber()in which$this->selectRowNumber()变成了一个数组!如果你再次调用$this->selectRowNumber()它会抛出一个异常,因为你只能调用它一次并且不再是一个方法。

我想知道这是否是一个好的编程实践,我认为绝对不是,因为它不容易理解和维护。也许您可以用另一种更清晰和线性的方式获得相同的结果。我要问的是:我是对的还是这是一种常见的做法?

谢谢

标签: phpmysqldesign-patternsjoomla

解决方案


你是说你能重现这个故障吗?我将假设您误读了脚本。

在我看来,该selectRowNumber()方法是第一次调用,然后在内部检查validateRowNumber()类变量/属性$this->selectRowNumber的真实性。

由于是null(假的)第一次,所以不会抛出异常。

类变量/属性(不是方法)更新为

$this->selectRowNumber = array(
    'orderBy' => $orderBy,
    'orderColumnAlias' => $orderColumnAlias,
  );

然后回到里面selectRowNumber()ROW_NUMBER() OVER (ORDER BY $orderBy) AS $orderColumnAlias字符串被应用到$this->select()

因为ROW_NUMBER() OVER (ORDER BY $orderBy) AS $orderColumnAlias不能对给定的查询应用两次,所以防护/抛出的异常会检查真实的类变量/属性——这当然是因为它已被修改null为非空关联数组。

属性和方法共享相同的名称是否令人困惑?当然。两者之间的唯一区别是尾随()

这是可接受的编码实践吗?好吧,就可读性而言,它并不理想。但是一旦一个项目标准化了它的命名约定,有时就会出现这种融合的名称。代码库越大,发生这种情况的可能性就越大。我认为在这种孤立的情况下,一致性比可读性更重要。


推荐阅读