0

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>
";
}
?>

これらのメソッドはクラスからのものです: 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
?>
4

1 に答える 1

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);
于 2013-07-30T13:18:59.677 に答える