【问题标题】:Why can't you have require* statements in a class definition?为什么在类定义中不能有 require* 语句?
【发布时间】:2011-05-05 16:26:53
【问题描述】:

可能相关:
Why don't PHP attributes allow functions?

如果以前有人问过这个问题,请原谅我,但是为什么你不能有类似以下的东西:

class foo {

 require_once 'defines.php';

 private $_server = DB_SERVER;
 private $_username = DB_USERNAME;
 private $_password = DB_PASSWORD;
 private $_database = DB_NAME;
 public  $debug = false;
 public $_conn;

 function __construct() {                          
    $connection = @mysqli_connect($this->_server, $this->_username, $this->_password, $this->_database);
 }

 ...

}

干杯,

编辑:希望找出为什么这种行为存在以及为什么它不可能。 投票怎么结束的?

EDIT2:还想重新打开这个

【问题讨论】:

  • 或者您可以简单地将常规变量放入包含文件中,并将该文件包含在您的构造函数中。您甚至可以将包含文件的文件名作为构造函数的参数。
  • 我的主要观点是,如果它不起作用,那是有原因的,也许你是错误地解决了这个问题。很可能有一种更简单、更直观的方式来处理问题。
  • 我不是故意让这个作为一个骗子被关闭 - 我投票太快了,它真的不是一个。投票重新开放-尽管我怀疑您是否会找到明确的答案。
  • 最主要的是,你做不到。这不会改变。至于为什么,可能有很多很好的原因,正如很多人提到的那样。至于我的看法,因为类的顶部是用于变量声明的。一个 require 语句不能正确地包含变量声明,你为什么想要那个?如果您需要包含文件/代码,请在构造函数或类的属性中执行。你可以整天争论它,最终它不会改变,因为我怀疑这里的许多人可以为 PHP 编码员说话。

标签: php oop class-design


【解决方案1】:

在将类添加到 PHP 之前,可以在函数范围内和全局范围内创建 requireinclude 文件。

这只是一个猜测——我不确定除了让语言设计者来告诉我们他们的故事之外我们还能做些什么——但我想人们相信,添加这个功能不会带来任何好处通过添加类发明的“新范围”,特别是考虑到添加到后端以支持它的复杂性。

对于在required 文件中进行的任何声明,范围规则是什么也并不完全清楚。

总之,我认为你问错了问题。而不是“为什么不支持这个?”更多的是“为什么要支持它?”。

我希望这对您有所帮助。

【讨论】:

  • class 范围既不是 function,也不是 global 范围。今天可以使用包含语句,就像在 PHP 实现类之前一样。什么都没有改变,只是出现了一个新概念。
  • @KingCrunch:我就是这么说的。我已经编辑了我的答案,希望能更清楚。
【解决方案2】:

这是因为在类定义中根本不允许使用“真实”代码,只允许定义属性、方法和常量。您可以将包含语句放入“主范围”(过程)、函数和方法中,就像所有其他代码一样。

class A {
  var $a = 1 + 1; // Parse error: unexpected '+'
}

但是,据我所知,它不支持任何语言。例如java为此使用静态代码块

class A {
  private static int a = 0;
  static {
    a = 1+1;
  }
}

在 PHP 中,只需将“静态”代码放在类本身之后。

class A {}
/* static */ {
  // do something
}

无法通过这种方式访问​​privateprotected static 成员。

【讨论】:

  • 可以理解。我想那时“真实代码”的定义会引起争论。论点是定义和静态常量应该是合格的,并且不包含任何额外的逻辑。
  • 虽然是一个非常松散的类比,C++ 的#include(作为预处理器指令)可以去任何地方,包括在类定义中。我当然意识到某些包含文件的内容可能在那里无效。
猜你喜欢
  • 1970-01-01
  • 2023-02-10
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多