質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

7回答

4836閲覧

パーフェクトPHPの8章のミニブログのエラー解決について

NaojirouHisada

総合スコア60

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

1クリップ

投稿2015/12/13 02:25

編集2015/12/15 07:57

現在
パーフェクトPHPを通して、
PHPを学んでいます。

そこで、
7章で、フレームワークの土台を作成しました。
miniblogというディレクトリの配下に、
core , web , models , controllers , viewsというディレクトリがあります。

8章では実際にミニブログの実装を行うのですが、
その際に、miniblogディレクトリ配下に、MiniBlogApplication.phpファイルを作成し、そのファイルに、coreのApplication.phpファイルの内容をextendsさせるというのがありました。
MiniBlogApplication.phpのソースコードはこれです。

<?php class MiniBlogApplication extends Application { protected $login_action = array('account' , 'signin'); public function getRootDir() { return dirname(__FILE__); } protected function registerRoutes() { return array( ); } protected function configure() { $this->db_manager->connect( 'master' , array( 'dsn' => 'mysql:dbname=mini_blog;host=localhost', 'user' => 'root', 'password' => '', ) ); } }

そのMiniBlogApplication.phpファイルを、webディレクトリ配下のindex.phpでrequireして使用するということでrequireしてみた結果、

Fatal error: Class 'Application' not found in /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/MiniBlogApplication.php on line 5

このようなエラーが発生しました。

そのため、
パーフェクトPHPのサンプルコード確認して、デバックし、再度index.phpを開いてみましたが、このエラーが消えません。

どなたか解決方法を教えていただけないでしょうか?
よろしくお願いします。

ちなみに、
miniblog/Core/Application.phpのソースコードはこれです。

<?php abstract class Application { protected $debug = false; protected $request; protected $response; protected $session; protected $db_manager; protected $login_action = array(); public function __construct($debug = false ) { $this->setDebugMode($debug); $this->initialize(); $this->configure(); } protected function setDebugMode($debug) { if ( $debug){ $this->debug = true; ini_set('display_errors' , 1 ); error_reporting(-1); } else { $this->debug = false; ini_set( 'display_errors' , 0 ); } } protected function initialize() { $this->request = new Request(); $this->response = new Response(); $this->session = new Session(); $this->db_manager = new DbManager(); $this->router = new Router ( $this->registerRoutes() ); } protected function configure() { } abstract public function getRootDir(); abstract protected function registerRoutes(); public function isDebugMode() { return $this->debug; } public function getRequest() { return $this->request; } public function gerResponse() { return $this->response; } public function getSession() { return $this->session; } public function getDbManager() { return $this->db_manager; } public function getControllerDir() { return $this->getRootDir() . '/controllers'; } public function getViewDir() { return $this->getRootDir() . '/views'; } public function getModelDir() { return $this->getRootDir() . '/models'; } public function getWebDir() { return $this->getRootDir() . '/web'; } public function run() { try{ $params = $this->router->resolve($this->request->getPathInfo() ); if ( $params === false){ throw new HttpNotFoundException( 'No route found for ' . $this->request->getPathInfo() ); } $controller = $params['controller']; $action = $params['action']; $this->runAction($controller,$action,$params); }catch (HttpNotFoundException $e){ $this->render404Page($e); } catch (UnauthorizedActionException $e){ list($controller , $action) = $this->login_action; $this->runAction($controller, $action); } $this->response->send(); } public function runAction($controller_name , $action , $params = array() ) { $controller_class = ucfirst($controller_name) . 'Controller'; $controller = $this->findController($controller_class); if ($controller === false){ throw new HttpNotFoundException( $controller_class . ' controller is not found . ' ); } $content = $controller->run($action , $params); $this->response->setContent($content); } protected function findController($controller_class) { if ( !class_exists($controller_class) ){ $controller_file = $this->getControllerDir() . '/' . $controller_class . '.php'; if ( !is_readable($controller_file) ){ return false; } else { require_once $controller_file; if ( !class_exists($controller_class) ){ return false; } } } return new $controller_class($this); } protected function render404Page($e) { $this->response->setStatusCode(404 , 'Not Found'); $message = $this->isDebugMode() ? $e->getMessage() : 'Page not found.'; $message = htmlspecialchars($message , ENT_QUOTES, 'UTF-8'); $this->response->setContent( <<<EOF <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>404</title> </head> <body> {$message} </body> </html> EOF ); } }
afroscript👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

afroscript

2015/12/15 07:28 編集

(質問の内容に直接関係ないので、恐縮ですが、)ソースコード部分を```で囲むとシンタックスハイライトになって見やすくなりますのでぜひ…!! ``` ソースコード ``` って感じです!
guest

回答7

0

ベストアンサー

/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/core/ClassLoader.php のソースを見せていただけますか?

投稿2015/12/16 08:31

hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NaojirouHisada

2015/12/16 09:16

これがClassLoader.phpのソースコードです。 ``` <?php class ClassLoader { protected $dirs; public function register() { spl_autoload_register(array($this,'loadClass') ); } public function registerDir($dir) { $this->dirs[] = $dir; } public function loadClass($class) { foreach ($this->dirs as $dir){ $file = $dir . '/' . $class > '.php'; if (is_readable($file) ){ require $file; return; } } } } ```
jinco

2015/12/16 09:40

$file = $dir . '/' . $class > '.php'; のところ $file = $dir . '/' . $class . '.php'; では?
hyper-drums-ko

2015/12/17 01:04

恐らくそうかと思われます。 そのため class がちゃんと load されていないんでしょうね。
jinco

2015/12/17 03:00

お見事でした。
NaojirouHisada

2015/12/17 06:16

hyper-drums-koさん、jincoさんありがとうございます(^^) 上記をデバックした結果、 以前のようなエラーはでませんでした! 本当にありがとうございます(^^) もしよければなのですが、 次にこのようなエラーがでており、 ``` Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [1049] Unknown database 'mini_blog'' in /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/core/DbManager.php:25 Stack trace: #0 /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/core/DbManager.php(25): PDO->__construct('mysql:dbname=mi...', 'root', '', Array) #1 /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/MiniBlogApplication.php(25): DbManager->connect('master', Array) #2 /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/core/Application.php(16): MiniBlogApplication->configure() #3 /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/web/index_dev.php(6): Application->__construct(true) #4 {main} thrown in /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/core/DbManager.php on line 25 ``` googleの翻訳を行うと、 ``` 致命的なエラー:キャッチされない例外のメッセージと「PDOException'' SQLSTATE[HY000] [1049]未知のデータベース「/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/core/DbManager.php:25スタックトレースでmini_blog'':#0/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/core/DbManager.php(25):PDOは - > __( 'mysqlの:DBNAME= MI...'構築、「ルートを'、' '、アレイ)#1/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/MiniBlogApplication.php(25):DbManager->接続(「マスター」、アレイ)#2/アプリケーション/ XAMPPが/ xamppfiles/ htdocsに/ミニブログ.localhost/コア/ Application.php(16):MiniBlogApplication->のconfigure()#3/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/web/index_dev.php(6):アプリケーション - > __構築物(真)#4{メイン}25行目/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/core/DbManager.phpでスロー ```とでていましたが、意味がよくわからいのです(^^;) DbManager.phpにエラーがあるということでしょうか(^^;) これがDbManager.phpのソースコードです。 ``` <?php class DbManager { protected $connections = array(); protected $repository_connection_map = array(); protected $repositories = array(); public function connect($name,$params) { $params = array_merge(array( 'dsn' => null, 'user' => '', 'password' => '', 'options' => array(), ), $params); $con = new PDO( $params[ 'dsn' ], $params[ 'user' ], $params[ 'password' ], $params[ 'options'] ); $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->connections[$name] = $con; } public function getConnection( $name = null) { if (is_null($name) ){ return current( $this->connections); } return $this->connections[$name]; } public function setRepositoryConnectionMap($repository_name , $name) { $this->repository_connection_map[$repository_name] = $name; } public function getConnectionForRepository($repository_name) { if (isset ( $this->repository_connection_map[$repository_name] ) ){ $name = $this->repository_connection_map[$repository_name]; $con = $this->getConnection($name); } else { $con = $this->getConnection(); } return $con; } public function get($repository_name) { if ( !isset ($this->repositories[$repository_name] ) ){ $repository_class = $repository_name . 'Repository'; $con = $this->getConnectionForRepository($repository_name); $repository = new $repository_class($con); $this->repositories[$repository_name] = $repository; } return $this->repositories[$repository_name]; } public function __destruct() { foreach ( $this->repositories as $repository){ unset($repository); } foreach ($this->connections as $ $con){ unset($con); } } } ```
jinco

2015/12/17 07:18

まずは当初出ていたエラーが解決できたので、この回答をベストアンサーに選ぶ等されたほうがhyper-drums-koさんに失礼がないかと。。 アプリ側で他にTypoなどでエラーがなければ、DBの設定を適切に行えば解決できると思います。 新しいエラーだとMySQLのDBに接続できないようですがmini_blogというデータベースは作成されましたか?作成していなければcreate database mini_blog;としてからMiniBlogApplication.phpの下の方にある接続情報とMySQLの権限を合わせれば動くはずです。mysql grantとかflush privilegesとかでググると出てくると思います。 もしかしたらphpmyadminでやったほうが楽かもしれないですね。
NaojirouHisada

2015/12/17 09:01

すみません(^^;) 今後気をつけます(^^;;) アドバイスありがとうございます。 やってみます!!
NaojirouHisada

2015/12/17 09:06

mini_blogのデータベースは作成しました(^^)
guest

0

アクセス時は MiniBlogApplication.php が直接呼ばれているわけではなく、webroot 配下の index.php が呼ばれてそこから Dispatch されているかと思いますので、index.php で適切に require されていれば動作するのではないかと思われます。

投稿2015/12/13 05:37

hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NaojirouHisada

2015/12/13 09:18

アドバイスありがとうございます!! indexの方でapplication.phpをrequireするということでしょうか??
hyper-drums-ko

2015/12/14 02:16

サンプルコードをダウンロードしてみました。 bootstrap.php でフレームワークのクラスをロードしているので index.php では require する必要はないですね。 以下の情報をいただけますか? ・Apache のドキュメントルート ・ブラウザからアクセスしたURL
NaojirouHisada

2015/12/14 05:49

これが、 Apacheのドキュメントルートです。 NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs" ServerName localhost </VirtualHost> <VirtualHost *:80> DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/web" ServerName mini-blog.localhost DirectoryIndex index.php index.html <Directory "/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/web"> AllowOverride All Allow from All </Directory> </VirtualHost> ブラウザからは、 http://mini-blog.localhost です。
guest

0

Fatal error: Class 'Application' not found

なので Application.php が見つからないようですね。

webディレクトリ配下のindex.phpでrequireして使用するということでrequireしてみた結果

上記の index.php も提示いただけますか。

投稿2015/12/13 02:36

hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NaojirouHisada

2015/12/13 09:16

アドバイスありがとうございます!! これが、 index.phpのソースコードです!! <?php require '../bootstrap.php'; require '../MiniBlogApplication.php'; $app = new MiniBlogApplication(true); $app->run();
jinco

2015/12/13 11:32

hyper-drums-koさん、回答を拝見しました。「index.php で適切に require されていれば動作する」ということは、このbootstrap.phpのrequireとMiniBlogApplication.phpのrequireの間でapplication.phpをrequireする必要があるということでしょうか?
hyper-drums-ko

2015/12/14 02:18

> このbootstrap.phpのrequireとMiniBlogApplication.phpのrequireの間でapplication.phpをrequireする必要があるということでしょうか? 下記でも回答しましたが、bootstrap.php でフレームワークのクラスをロードしているので require する必要はないようですね。
guest

0

もしかしてApplication.phpの58行目にあるgetResponse()メソッドがgerResponse()になってるのが原因じゃないですか?

投稿2015/12/16 08:12

jinco

総合スコア432

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NaojirouHisada

2015/12/16 09:19

ご指摘ありがとうございます。 今現在デバックを行い再度XAMPPを起動してみましたが、 やはり、 Fatal error: Class 'Application' not found in /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/MiniBlogApplication.php on line 5 のエラーが発生したままでした(^^;)
guest

0

index.php を以下のように変更すると、何が表示されますか?

PHP

1<?php 2 3require '../bootstrap.php'; 4require '../MiniBlogApplication.php'; 5 6var_dump(get_included_files()); 7 8//$app = new MiniBlogApplication(true); 9//$app->run();

投稿2015/12/15 01:39

hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NaojirouHisada

2015/12/15 02:45

このようなエラーが出ました(^^;) Fatal error: Class 'Application' not found in /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/MiniBlogApplication.php on line 5
hyper-drums-ko

2015/12/15 02:55

エラーが出るので --- $app = new MiniBlogApplication(true); $app->run(); --- の行はコメントアウトしてください。
NaojirouHisada

2015/12/15 06:01

コメントアウトして行ってみましたが、 やはり上記のエラーがでたままでした(^^;)
hyper-drums-ko

2015/12/15 09:30

ごめんなさい。 --- require '../MiniBlogApplication.php'; --- の行もコメントアウトしてみてください。。。
NaojirouHisada

2015/12/15 17:08

返信が遅くなりまして、申し訳ございません(^^;) コメントアウトを行ってみた結果、 このようにでました(^^) ``` array(3) { [0]=> string(71) "/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/web/index.php" [1]=> string(71) "/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/bootstrap.php" [2]=> string(78) "/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/core/ClassLoader.php" } ```
guest

0

bootstrap.php でクラスが正しくロードされていないように思われます。

PHP

1<?php 2 3require 'core/ClassLoader.php'; 4 5$loader = new ClassLoader(); 6$loader->registerDir(dirname(__FILE__).'/core'); 7$loader->registerDir(dirname(__FILE__).'/models'); 8$loader->register();

となっており、bootstrap.php と同じ階層に「core」「models」ディレクトリが存在するでしょうか。

また、「core」ディレクトリ内に「Application.php」ファイルが存在しておりますでしょうか。

投稿2015/12/14 07:56

hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NaojirouHisada

2015/12/14 08:01

はい!bootstrapと同じ階層にcoreとmodelsディレクトリがありまして、 coreディレクトリ内に、Application.phpファイルはあります!!(^^)
hyper-drums-ko

2015/12/14 08:35

> そこで、 7章で、フレームワークの土台を作成しました。 miniblogというディレクトリの配下に、 Core , web , models , controllers , viewsというディレクトリがあります。 > ちなみに、 miniblog/Core/Application.phpのソースコードはこれです。 先頭が「Core」と大文字になっているようですが、実際のディレクトリ名は小文字で「core」でしょうか?
NaojirouHisada

2015/12/14 08:55

ちゃんと「core」で作成しています(^^) 紛らわしい書き方をしてしまい申し訳有りません(^^;)
jinco

2015/12/14 12:10

ls -l /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost の結果はどうなりますか?
NaojirouHisada

2015/12/14 16:24

このようなエラーが出ました(^^;) Fatal error: Class 'Application' not found in /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/MiniBlogApplication.php on line 5
jinco

2015/12/14 19:56

もしかするとファイル権限の問題かなと思ったので「ターミナル」を開いて上のコマンドを実行して確認してみてください。coreディレクトリの権限に問題がないようなら、下で中身を確認してみるとか。 ls -l /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/core
NaojirouHisada

2015/12/15 02:51

このような結果がでました(^^;) -rw-r--r--@ 1 hisadanaojirou staff 3451 12 5 15:33 Application.php -rw-r--r--@ 1 hisadanaojirou staff 392 11 27 16:07 ClassLoader.php -rw-r--r--@ 1 hisadanaojirou staff 2968 12 6 10:48 Controller.php -rw-r--r--@ 1 hisadanaojirou staff 1731 12 6 10:59 DbManager.php -rw-r--r--@ 1 hisadanaojirou staff 592 11 30 15:03 DbRepository.php -rw-r--r--@ 1 hisadanaojirou staff 58 12 6 11:01 HttpNotFoundException.php -rw-r--r--@ 1 hisadanaojirou staff 1442 11 9 20:33 Request.php -rw-r--r--@ 1 hisadanaojirou staff 682 11 10 11:21 Response.php -rw-r--r--@ 1 hisadanaojirou staff 954 12 6 11:10 Router.php -rw-r--r--@ 1 hisadanaojirou staff 976 12 6 11:13 Session.php -rw-r--r--@ 1 hisadanaojirou staff 63 12 6 11:14 UnauthorizedActionException.php -rw-r--r--@ 1 hisadanaojirou staff 899 12 6 11:16 View.php 実行権限がないからでしょうか??
jinco

2015/12/15 03:03

coreフォルダの権限も同じく↓なのでしょうか? -rw-r--r--@ 1 hisadanaojirou staff
NaojirouHisada

2015/12/15 04:00

ls -l /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost とターミナルに記述しましたら、このようにでました。 -rw-r--r--@ 1 hisadanaojirou staff 3451 12 5 15:33 Application.php -rw-r--r--@ 1 hisadanaojirou staff 392 11 27 16:07 ClassLoader.php -rw-r--r--@ 1 hisadanaojirou staff 2968 12 6 10:48 Controller.php -rw-r--r--@ 1 hisadanaojirou staff 1731 12 6 10:59 DbManager.php -rw-r--r--@ 1 hisadanaojirou staff 592 11 30 15:03 DbRepository.php -rw-r--r--@ 1 hisadanaojirou staff 58 12 6 11:01 HttpNotFoundException.php -rw-r--r--@ 1 hisadanaojirou staff 1442 11 9 20:33 Request.php -rw-r--r--@ 1 hisadanaojirou staff 682 11 10 11:21 Response.php -rw-r--r--@ 1 hisadanaojirou staff 954 12 6 11:10 Router.php -rw-r--r--@ 1 hisadanaojirou staff 976 12 6 11:13 Session.php -rw-r--r--@ 1 hisadanaojirou staff 63 12 6 11:14 UnauthorizedActionException.php -rw-r--r--@ 1 hisadanaojirou staff 899 12 6 11:16 View.php hisadanaojirou-no-MacBook-Pro:~ hisadanaojirou$ ls -l /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost total 2600 -rw-r--r--@ 1 hisadanaojirou staff 437 12 13 11:14 MiniBlogApplication.php -rw-r--r--@ 1 hisadanaojirou staff 190 11 28 13:51 bootstrap.php drwxr-xr-x 2 hisadanaojirou staff 68 11 8 10:08 controllers drwxr-xr-x 15 hisadanaojirou staff 510 12 6 11:16 core -rw-r--r--@ 1 hisadanaojirou staff 1317800 12 6 11:17 core 14.04.52 drwxr-xr-x 2 hisadanaojirou staff 68 11 8 10:08 models drwxr-xr-x 2 hisadanaojirou staff 68 11 8 10:08 views drwxr-xr-x 6 hisadanaojirou staff 204 12 15 11:44 web -rw-r--r--@ 1 hisadanaojirou staff 129 11 28 13:53 名称未設定.txt
jinco

2015/12/16 07:53

Application.phpの中身(最初の10行程度)はどうなっていますでしょうか? 下記の行のクラス名は「Application」になっていますか?手元の環境で試したところ、ここを「Application2」等に変更すると同じエラーが出ました。 abstract class Application coreフォルダのコピーを作成されているようなので、テスト中に変更してしまったというようなことはありませんか?
NaojirouHisada

2015/12/16 09:20

検索してみましたが、 abstract class Applicationと記述していました(^^;)
guest

0

MiniBlogApplication.phpではapplication.phpをrequireする必要はないんですか?

投稿2015/12/13 03:39

jinco

総合スコア432

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NaojirouHisada

2015/12/13 09:17

MiniBlogApplication.php では、applicationクラスをextendsしてますが、 書籍とサンプルコードでは、このようになっていましたけど、 フレームワークを構築しているため必要なんだと思います(^^;)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問