Php Joomla JDatabase:selectRowNumber使用类属性或方法

Php Joomla JDatabase:selectRowNumber使用类属性或方法,php,mysql,design-patterns,joomla,Php,Mysql,Design Patterns,Joomla,在Joomla 3.9.16中,有一个类属性的strage用法,它也被用作方法 在libraries/joomla/database/query.php中,您可以找到: protected $selectRowNumber = null; 而且 public function selectRowNumber($orderBy, $orderColumnAlias) { $this->validateRowNumber($orderBy, $orderColumnAlias); $

在Joomla 3.9.16中,有一个类属性的strage用法,它也被用作方法

在libraries/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,它会抛出一个异常,因为您只能调用它一次,并且不再是一个方法

我想知道这是否是一个好的编程实践,我想肯定不是因为不容易理解和掌握。也许你可以用另一种更清晰、更线性的方式得到同样的结果。 我要问的是:我是对的还是这是一种普遍的做法


谢谢

你是说你可以重现这个错误吗?我假设你误读了剧本

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

由于第一次为null false,因此不会引发异常

更新的类变量/属性不是方法

$this->selectRowNumber = array(
    'orderBy' => $orderBy,
    'orderColumnAlias' => $orderColumnAlias,
  );
然后回到selectRowNumber中, ORDER BY$orderBy AS$ORDERCLUMNALIAS字符串上的行号应用于$this->select

由于ORDER BY$orderBy AS$ORDERCLUMNALIAS上的行号不能对给定查询应用两次,因此安全保护/引发的异常会检查truthy类变量/属性,这当然是因为它已从null修改为非空关联数组

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


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

你是说你可以重现这个错误吗?我假设你误读了剧本

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

由于第一次为null false,因此不会引发异常

更新的类变量/属性不是方法

$this->selectRowNumber = array(
    'orderBy' => $orderBy,
    'orderColumnAlias' => $orderColumnAlias,
  );
然后回到selectRowNumber中, ORDER BY$orderBy AS$ORDERCLUMNALIAS字符串上的行号应用于$this->select

由于ORDER BY$orderBy AS$ORDERCLUMNALIAS上的行号不能对给定查询应用两次,因此安全保护/引发的异常会检查truthy类变量/属性,这当然是因为它已从null修改为非空关联数组

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


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

如果您正在进行Joomla开发,请加入我们的Stack Exchange。如果您正在进行Joomla开发,请加入我们的Stack Exchange。感谢您的回复!不,这不是一个错误,这段代码是有效的,我的问题只是关于代码的可读性。我在这个类的NodeJS/mysql2中做一个端口,所以我想对这个方法发表一点意见。我是否已经充分澄清了这个方法没有变成数组?属性从null变为数组。询问为什么其他开发人员以特定的方式编写代码几乎是离题的:基于观点……所以在将来询问堆栈溢出问题时,请注意这一点。如果我已经解决了您的问题,请奖励绿色勾号。如果没有,请告诉我还有什么需要解决的。谢谢你的回复!不,这不是一个错误,这段代码是有效的,我的问题只是关于代码的可读性。我在这个类的NodeJS/mysql2中做一个端口,所以我想对这个方法发表一点意见。我是否已经充分澄清了这个方法没有变成数组?属性从null变为数组。询问为什么其他开发人员以特定的方式编写代码几乎是离题的:基于观点……所以在将来询问堆栈溢出问题时,请注意这一点。如果我已经解决了您的问题,请奖励绿色勾号。如果没有,请告诉我还有什么需要解决的。