(我也一直试图让语法看起来像: $Post::find(1); 但这完全是一个不同的纯粹审美问题)
使用范围解析运算符时,您正在访问静态方法和/或常量。这些是作用于类而不是类的实例的方法。例如:
// the find method retuns a new Post instance and
// does not try to access $this
$post = Post::find(1);
至于从数组为帖子创建对象,最好创建自己的Post
类并相应地填充它,或者使用将表数据作为对象而不是数组返回的数据库函数之一,例如mysqli_result::fetch_object
or mysql_fetch_object
。
如果创建您自己的 Post 类,您可以将数据库信息存储在一个数组中并使用__call()
,__get()
和__get()
魔术方法来访问该数据。例如:
class Post() {
protected $data;
public function __construct($data) {
$this->data = $data;
}
// access data with a getFoobar() style call
public function __call($name, $args) {
if (substr($name, 0, 3) == 'get') {
$key = strtolower(substr($name, 3));
if (array_key_exists($key, $this->data)) {
return $this->data[$key];
}
}
$class = get_class($this);
throw new Exception("Call to undefined method $class::$name");
}
// access data like a class property
public function __get($key) {
if (array_key_exists($key, $this->data)) {
return $this->data[$key];
}
throw new Exception("Attempt to access non-existant property $class::$name");
}
// set the data like a class property
public function __set($name, $value) {
$this->data[$name] = $value;
}
}