php - 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()
它会抛出一个异常,因为你只能调用它一次并且不再是一个方法。
我想知道这是否是一个好的编程实践,我认为绝对不是,因为它不容易理解和维护。也许您可以用另一种更清晰和线性的方式获得相同的结果。我要问的是:我是对的还是这是一种常见的做法?
谢谢
解决方案
你是说你能重现这个故障吗?我将假设您误读了脚本。
在我看来,该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
为非空关联数组。
属性和方法共享相同的名称是否令人困惑?当然。两者之间的唯一区别是尾随()
。
这是可接受的编码实践吗?好吧,就可读性而言,它并不理想。但是一旦一个项目标准化了它的命名约定,有时就会出现这种融合的名称。代码库越大,发生这种情况的可能性就越大。我认为在这种孤立的情况下,一致性比可读性更重要。
推荐阅读
- javascript - 是否有可以产生 1/f(粉红噪声)波动的 node.js 模块?
- jquery - 用 replace() 在字符串的括号中只保留一个数字
- android - 移动应用程序可以在没有独立穿戴应用程序的情况下为表盘提供数据吗?
- python - 如何使python弹出窗口保持在顶部
- node.js - 如何在 React.js 中循环从服务器接收到的数据?
- java - 不在滚动视图中滚动
- python - 悬停数据并单击 dash_table 上的数据
- php - 如何从 WP 插件函数内部的外部 PHP 文件调用函数
- xpath - 如何解决动态 xpath(执行后 id 更改)
- r - 使用 mutate_at 通过使用同一数据框中的其他列来创建新列