setFetchMode使用PHP中的命名空间键入Class

时间:2013-07-30 13:17:17

标签: php pdo

我正在尝试使用setFetchMode和FETCH_CLASS填充PHP类中的一些变量。

<?php # index.php
use myproject\user\User;
use myproject\page\Page;

$q = 'SELECT * FROM t';
$r = $pdo->query($q);

  // Set the fetch mode:
  $r->setFetchMode(PDO::FETCH_CLASS, 'Page');

 // Records will be fetched in the view:
 include('views/index.html');
?>

在我的视图文件中,我有:

<?php # index.html
// Fetch the results and display them:
while ($page = $r->fetch()) {
echo "<article>
<h1><span>{$page->getDateAdded()}</span>{$page->getTitle()}</h1>
<p>{$page->getIntro()}</p>
<p><a href=\"page.php?id={$page->getId()}\">read more here...</a></p>
</article>
";
}
?>

这些方法来自Class:Page.php:

<?php # Page.php
function getCreatorId() {
 return $this->creatorId;
}
function getTitle() {
 return $this->title;
}
function getContent() {
 return $this->content;
}
function getDateAdded() {
 return $this->dateAdded;
}
?>

使用标准类时非常简单,也就是说,我已经完成了所有工作;然而,名字空间似乎有问题。

例如,如果我使用:

<?php # index.php
require('Page.php'); // Page class
$r->setFetchMode(PDO::FETCH_CLASS, 'Page'); // works
?>

但是在使用名称空间时,

<?php # index.php
use myproject\page\Page;
?>
// Set the fetch mode:
$r->setFetchMode(PDO::FETCH_CLASS, 'Page'); // problem

// Records will be fetched in the view:
include('views/index.html');
?>

浏览到index.php和浏览器报告:

致命错误:在第5行的/var/www/PHP/firstEclipse/views/index.html中的非对象上调用成员函数getDateAdded()

我的命名空间路径都已正确设置,因为我已使用上述命名约定成功实例化了对象,例如:

<?php # index.php

use myproject\page\User; # class: /myproject/page/user/User.php
$b = new User();
print $b->foo(); // hello
?>

1 个答案:

答案 0 :(得分:3)

如果您使用的是早于5.5的PHP

您需要提供班级的完全限定名称:

use myproject\page\Page;

$r->setFetchMode(PDO::FETCH_CLASS, 'myproject\page\Page');

不幸的是你必须像这样重复自己(如果你决定从另一个命名空间切换到另一个类Page,这段代码就会中断),但是没有办法绕过丑陋。

如果您使用的是PHP 5.5

你很幸运!新的::class关键字旨在帮助解决此问题:

// PHP 5.5+ code!
use myproject\page\Page;

// Page::class evaluates to the fully qualified name of the class
// because PHP is providing a helping hand
$r->setFetchMode(PDO::FETCH_CLASS, Page::class);