Joomla JDatabase:selectRowNumber使用类属性或方法很奇怪

问题描述 投票:0回答:1

在Joomla 3.9.16中,对class属性进行了分阶段使用,该类属性也用作方法!

在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(),其中$this->selectRowNumber()成为数组!如果再次调用$this->selectRowNumber(),它将引发异常,因为您只能调用一次,而不再是方法。

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

谢谢

php mysql design-patterns joomla
1个回答
0
投票

您是说可以重现此错误?我将假设您误读了脚本。

在我看来,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不得两次应用于给定查询,所以guard / throw Exception会检查真实的类变量/属性,这当然是因为它已从null修改为非空关联数组。

具有相同名称的属性和方法会引起混淆吗?当然。两者之间的唯一区别是尾随()

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

© www.soinside.com 2019 - 2024. All rights reserved.