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

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

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

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

composer

Composerとは、PHP5.3.2以上で使用可能なパッケージ管理ツールです。指定ディレクトリ内だけでパッケージ管理します。

Q&A

解決済

2回答

15012閲覧

[PHP] Classのautoloadがうまくいかない

zushi0905

総合スコア683

PHP

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

composer

Composerとは、PHP5.3.2以上で使用可能なパッケージ管理ツールです。指定ディレクトリ内だけでパッケージ管理します。

0グッド

1クリップ

投稿2019/07/02 03:16

編集2019/07/02 04:29

お世話になっております。
composerを使ってクラスをautoloadする環境を作ろうとしたところ躓いてしまったので、ご助言いただきたいです。

こちらのサイトを参考にさせて頂いています。
素のPHPでも最低限.envとmonologくらいは使う際の手順

やりたいこと

autoloadでClassフォルダ内Sample名前空間を呼び出せるようにし、test.phpからsampleClassを利用したいです。

エラー内容

$ php test.php hoge Fatal error: Uncaught Error: Class 'Sample\sampleClass' not found in /Users/username/php/ebay/test.php:19 Stack trace: #0 {main} thrown in /Users/username/php/ebay/test.php on line 19

やったこと

  • composer update

Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files

- composer dump-autoload

Generated autoload files containing 0 classes

- クラスをnewするとき括弧をつけてみる。 - test.php の use をuse Sample;にしてみる。 ### コード ** ./Classes/Sample.php ** ```php <?php namespace Sample; class sampleClass{ public function Hello() { echo "Hello Sample\n"; } }

** ./composer.json **

json

1{ 2 "require": { 3 "vlucas/phpdotenv": "^3.4", 4 "monolog/monolog": "^1.24" 5 }, 6 "autoload": { 7 "psr-4": { 8 "Sample\" : "Classes/" 9 } 10 } 11} 12

** test.php **

php

1<?php 2 3 //require 4 require './vendor/autoload.php'; 5 6 7 use Sample\sampleClass; 8 //.envの保存場所指定(カレントに設定) 9 $dotenv = Dotenv\Dotenv::create(__DIR__); 10 11 $dotenv->load(); 12 13 //利用 14 //値を取得 15 $name = getenv('TEST_NAME'); 16 echo $name; 17 18 19 $sc = new sampleClass; 20 $sc->Hello();

ご助言お願い致します。

追記 フォルダ構成

. ├── Classes │   └── Sample.php ├── composer.json ├── composer.lock ├── test.php └── vendor ├── autoload.php ├── composer ├── monolog ├── phpoption ├── psr ├── symfony └── vlucas

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

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

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

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

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

guest

回答2

0

ベストアンサー

クラス名がSample¥sampleClassなので、ファイル名がClasses/sampleClass.phpでないとオートローダの対象にならないかと思います。ファイル名とクラス名は合わせる必要があります。


追記
composer dump-autoload --optimize すると、composer.jsonのautoloadに書いたディレクトリ内を
全て読みにいって、vendor/composer/autoload_classmap.phpを生成するようです。
手元の環境でためすと、autoloadに定義したディレクトリ内であれば、PSR-4準拠していないパスでもクラスマップ配列は作成されました。

autoload_classmap.phpが存在することで、毎回個別にファイルチェックすることをスキップすることができるようです。
autoload_classmap.phpに定義されていないものは(最適化レベルによりますが)PSR-4準拠のオートローダが動作します。
PSR-4の準拠の場合、クラス名からファイルを特定するため、namespaceがディレクトリ、クラス名がファイル名と対になるように定義する必要があります。

最適化については公式サイトにも詳しく書かれていました。
Autoloader Optimization - Composer

投稿2019/07/02 04:53

編集2019/07/02 11:18
Eggpan

総合スコア2727

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

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

zushi0905

2019/07/02 04:59

ありがとうございます。ちょうど同じタイミングに無事解決しました。 $ composer auto-load --optimizaを実行すれば名前を合わせなくても通るようなのですが、これはどういう事なのでしょうか?
Eggpan

2019/07/02 11:23

optimizeオプションを使った場合、PSR-4準拠していないパスであってもclassmapファイルが作成され、パスが特定出来るようになるので通るようになるみたいです。回答に追記しました。 動作としては--optimizeすると通るクラスが増えそうですが、この動作がComposerの仕様なのかは分かりませんでした。 ただ、PSR-4準拠してませんし、クラス名を見てどのファイルか特定できなくなるので、optimizeに頼らずクラス名とファイル名は合わせておいたほうが良いかと思います。
guest

0

直に書いたらどうなりますか?
$sc = new Sample\sampleClass;

追記:

Generated autoload files containing 0 classes

この時点で「読み込み対象のクラスが含まれていない」ということになります。
読み込めていると 0 ではなく配下のクラス数が表示されます(今回はおそらく1 classesと出るはず)

投稿2019/07/02 03:35

編集2019/07/02 04:15
m.ts10806

総合スコア80842

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

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

zushi0905

2019/07/02 03:43

エラーの内容は変わりませんでした。 require './Classes/Sample.php';で直接読み込んで、$sc = new Sample\sampleClass;をやるとうまく動きます。
m.ts10806

2019/07/02 03:47

念のため各ファイルの位置関係を質問に追記いただけますか? ディレクトリ構成が分かる情報ですね。
zushi0905

2019/07/02 04:32

追記致しました。 回答に追記して頂いた事は自分も思っていて、composer.jsonがアップデート出来ていないのかと思い、composer install, composer updateなど試すのですが、Nothing install or updateと言われてしまいます。
m.ts10806

2019/07/02 04:38

私も昔このあたりで苦労した記憶があって試してはいるのですが、同じ現象から抜け出せませんね。 もう少しやってみます。 ※たぶんファイル名とクラス名が違うとは関係ないでしょうけど・・・Eclipseからは参照できるので、何かおかしいんでしょうね。
m.ts10806

2019/07/02 04:46

/vendor/composer/autoload_psr4.phpにもマッピングがちゃんと追加されているし、できそうにはみえるんですけどね・・
zushi0905

2019/07/02 04:52

https://qiita.com/ikaru92/items/8bac530757738a374d4c こちらの記事を参照して原因がわかりました。 問題はファイル名とクラス名が一致していないところのようです。 また、$composer auto-load --optimize で最適化を行っても解決しました。 お手伝いいただいたおかげで無事解決まで到達できました。ありがとうございます。
zushi0905

2019/07/02 04:53

もし良かったらベストアンサーを差し上げたいので回答を更新していただけますか?
m.ts10806

2019/07/02 05:13

Eggpanさんの回答で良いと思いますよ。 私は「なんとなく可能性」で書いていますが、Eggpanさんは明確に仰っていますし。
zushi0905

2019/07/02 05:16

コメントしたと同時にEggpanさんが回答してくださったのでベストアンサーにしました。 今回もありがとうございました。
m.ts10806

2019/07/02 05:19

https://qiita.com/eidera/items/3e0b2b41253e1563be46 >--optimize(又は-o)オプションを付けるとPSR-4規約のオートローディング対象となっている全クラスがクラスマップに含まれる。 Javaとかもそうですが、大抵は「ファイル名とクラス名が完全一致」というのが原則だったりします。 CakePHP,Laravelなどのフレームワークでもそうですね。そのため「ファイル名とクラス名を一致しているかどうか確認する」のが通常で、このオプションをつけることでそのひと手間がなくなる・・・みたいなイメージでしょうか。
m.ts10806

2019/07/02 05:19

解決されたようで何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問