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

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

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

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

Q&A

解決済

2回答

1359閲覧

【PHP】クラスをnewして呼ぼうとすると not foundになる

azuapricot

総合スコア2341

PHP

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

0グッド

0クリップ

投稿2019/08/26 07:04

前回質問に引き続き、現在も「booked」という予約管理システムのオープンソースの改修をしています。

今度はデータベースからデータを取得して格納するために、ファイルを一つ追加しました。
そのファイルは以下となります(今回あまり中身は関係ないかもしれません)

PHP

1<?php 2require_once(ROOT_DIR . 'lib/Database/Commands/namespace.php'); 3 4interface IComment2Repository 5{ 6 /** 7 * @return array[] 8 */ 9 public function GetAll(); 10} 11 12class Comment2Repository implements IComment2Repository 13{ 14 /** 15 * @var DomainCache 16 */ 17 private $_cache; 18 19 public function __construct() 20 { 21 $this->_cache = new DomainCache(); 22 } 23 24 public function GetComment2List() 25 { 26 $comment2Ary = array(); 27 28 $reader = ServiceLocator::GetDatabase()->Query(new GetComment2ListCommand()); 29 while ($row = $reader->GetRow()) { 30 31 $comment2Ary = array($row[ColumnNames::TEST_A]=>$row[ColumnNames::TEST_B]); 32 } 33 34 $reader->Free(); 35 36 return $comment2Ary; 37 } 38} 39

このファイルを、別ファイルから読み込みたいというのが今回悩んでいるところです。
(読み込み部分は下記)

PHP

1protected function LoadInitializerFactory() 2 { 3 $userRepository = new UserRepository(); 4 $comment2Repository = new Comment2Repository(); // コイツを読み込みたい・・・ 5 return new ReservationInitializerFactory( 6 new ScheduleRepository(), $userRepository, new ResourceService(new ResourceRepository(), 7 $this->permissionServiceFactory->GetPermissionService(), 8 new AttributeService(new AttributeRepository()), 9 $userRepository, 10 new AccessoryRepository()), 11 new ReservationAuthorization(AuthorizationServiceFactory::GetAuthorizationService()), 12 $comment2Repository 13 ); 14 }

こんな感じで new してみたのですが、案の定 ClassNotFoundExceptionが出てしまいました。↓

Uncaught exception: Error: Class 'Comment2Repository' not found in /var/www/booked/Pages/Reservation/ReservationPage.php:401

また、基本的には原因コードの上に記載してある、 UserRepository() を真似しているのですが、
こいつが読み込まれている? namespace.php に同じように以下のように記述をすると、

PHP

1require_once(ROOT_DIR . 'Domain/Access/UserRepository.php'); 2require_once(ROOT_DIR . 'Domain/Access/Comment2Repository.php');

今度は開発サーバーが動かなくなってしまいました・・・。

↓ その時の画像

イメージ説明


パスやファイル名などは合っているはずなのですが、オープンソースのPHPに新しいファイルは追加できないのでしょうか・・・(そんなはずないと思うんですが。。。)

それとも新しいファイルを読み込む際には namespace.phpに読み込み先を記述するだけでは足りない?のでしょうか・・・

お時間ある方で、もしお心当たりがある方いらっしゃいましたらご助力頂けますと幸いです。

また、足りない情報などがあれば追記しますのでお申し付け下さい。

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

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

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

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

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

guest

回答2

0

念の為解決方法を記載

m.ts10806さん 前回に引き続き本当にありがとうございます・・・!

私が無能なだけでした。

原因部分

PHP

1<?php 2require_once(ROOT_DIR . 'lib/Database/Commands/namespace.php'); 3 4interface IComment2Repository 5{ 6 /** 7 * @return array[] 8 */ 9 public function GetAll(); // こいつと 10} 11 12class Comment2Repository implements IComment2Repository 13{ 14 /** 15 * @var DomainCache 16 */ 17 private $_cache; 18 19 public function __construct() 20 { 21 $this->_cache = new DomainCache(); 22 } 23 24 public function GetComment2List() // こいつの関数名が違うから 25 { 26 $comment2Ary = array(); 27 28 $reader = ServiceLocator::GetDatabase()->Query(new GetComment2ListCommand()); 29 while ($row = $reader->GetRow()) { 30 31 $comment2Ary = array($row[ColumnNames::TEST_A]=>$row[ColumnNames::TEST_B]); 32 } 33 34 $reader->Free(); 35 36 return $comment2Ary; 37 } 38}

質問文に 今回あまり中身は関係ないかもしれませんが・・・ とか書いといて何が関係ないだ大問題だばかやろう!!!!!

インターフェースとか今まで適当にやってきたツケがここ最近やってきてますね・・・

あと404エラーじゃなくて 500エラー だったのもポイントだった・・・

自分が作ったクラスを呼び出せてる & そのクラスが致命的にみすってるから500エラーが出てたっていうことに気がつけなかった・・・

めちゃめちゃ学びました。大感謝・・・。

投稿2019/08/26 07:48

azuapricot

総合スコア2341

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

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

0

ベストアンサー

オブジェクト インターフェイス

インターフェイスを実装するには、implements 演算子を使用し、 **このインターフェイスに含まれる全てのメソッドを実装する必要があります。 実装されていない場合、致命的エラーとなります。 **各インターフェイスをカンマで区切って指定することで、 クラスは複数のインターフェイスを実装することができます

見た感じ、IComment2Repositoryを実装しているComment2RepositoryクラスにGetAll()メソッドが実装されてない事によってエラーになっているように思います。

php

1<?php 2interface test { 3 4 function hoge(); 5} 6 7class fuga implements test{ 8 function f(){ 9 echo 1; 10 } 11} 12$f = new fuga(); 13$f->f(); 14$f->hoge(); 15// PHP Fatal error: Class fuga contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (test::hoge)

正しくは

php

1<?php 2interface test { 3 4 function hoge(); 5} 6 7class fuga implements test{ 8 function f(){ 9 echo 1; 10 } 11 function hoge(){ //実装必須メソッド 12 echo 2; 13 } 14} 15$f = new fuga(); 16$f->f(); 17$f->hoge(); 18

エラーが画面に出てこないのは、おそらくサーバー側(またはphp内で)設定によってfatalエラーは出ないようになっているのかなと。
エラー出力レベルをE_ALLにしてみては如何でしょうか。

投稿2019/08/26 07:27

編集2019/08/26 07:30
m.ts10806

総合スコア80850

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

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

azuapricot

2019/08/26 07:30

呼び出し処理がなにか足りてないのかと思いきや私が作ったクラスがそもそも間違っていたと・・・確認します・・・!
m.ts10806

2019/08/26 07:32

ちょこちょこ追記しているので後で確認しておいてもらいたいのですが、 呼び出せているから500になったと言っても良いですね。 作ったクラスが間違っていたというより、実装が足りていなかったというのが正しいかなと。 定義されているメソッドの実装を強制するのがインターフェースなので、実装してないと怒られます。
azuapricot

2019/08/26 07:35

あ、なるほど・・・呼び出せてないのかとまた勘違いしてましたが、 呼び出せてるから致命的エラーが出たんですね・・・んんん無能さを恥じるばかりです。。。
m.ts10806

2019/08/26 07:39 編集

エラーログにFatal記録されてるかも念のため確認してみてください。 ※私もなんだかんだんでインターフェースのありがたみを知ったのもSpringきちんと学んでからだったりします。PHPで全然自分で組んだことがなかった
azuapricot

2019/08/26 07:42

うわぁできた・・・できました・・・・ 今回でもうインターフェースの重要さを痛感しました・・・ 適当にやってちゃだめなんですね・・・ 前回に引き続き本当助かりましたありがとうございます!!
m.ts10806

2019/08/26 07:43

解決されたようで何よりです。 開発中はやはりE_ALLにしておくに限りますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問