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

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

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

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

composer

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

Q&A

2回答

928閲覧

独自オートローダーでclassが見つけられない

Citrusxparadi

総合スコア0

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

composer

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

0グッド

0クリップ

投稿2020/07/12 06:25

編集2022/01/12 10:55

###実現したいこと
通常はComposerを使って以下で実行できるプラグインがあります。(JSONの構造を検証するJson Schemaというプラグインです。)

これを独自オートローダーで実行したいと思っています。

【header.php】

php

1<?php 2// Composerがあればこれでできる 3require 'vendor/autoload.php'; 4a 5// "schema.json"にある JSON の構造を検証する 6$json = '{"a":1, "b":2}'; 7$schema = file_get_contents('./schema.json'); 8$v = new JsonSchema\Validator; 9$v->check(json_decode($json), json_decode($schema));

###試したこと
そのためにこちらのサイトから独自オートローダー【ClassLoader.php】をDLしました。「自動で必要なものを読んでくれる機能」があるようです。

そしてこれを次のように// Composerが使えないのでこうしたとしたのですが、// ここでエラーとなってしまいます。

【header.php】

<?php // Composerが使えないのでこうした require_once DIR_TEMPLATE . '/plugins/Autoloader-master/ClassLoader.php'; // "schema.json"にある JSON の構造を検証する $json = '{"a":1, "b":2}'; $schema = file_get_contents('./schema.json'); $v = new JsonSchema\Validator; // ここでエラー $v->check(json_decode($json), json_decode($schema));

###独自オートローダーのコード
先のDLした【ClassLoader.php】は次の通りで、// コメントに従って$DefaultPathを次のように変更したのように変更しましたが、何か間違っているでしょうか?

【ClassLoader.php】

PHP

1<?php 2 3/** 4 * 自作オートローダ 5 * require_once地獄に囚われないために、 6 * 指定されたクラス名から、$DefaultPathで指定されたディレクトリの 7 * サブディレクトリまでいって再帰的に検索して探してrequire_onceする。 8 * 使い方は使用するrequire_once 'ClassLoader.php'; 9 */ 10class ClassLoader 11{ 12 // コメントに従って$DefaultPathを次のように変更した 13 //private static $DefaultPath = "./src"; 14 private static $DefaultPath = DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema'; 15 private static $ClassName; 16 17 /** 18 * クラス検索 19 * self::$DefaultPathで指定されたディレクトリ以下を検索する 20 * @param string $FilePath 最初だけ呼び出されたClass名が入り、以降はディレクトリ名が入る 21 * @return boolean 成功ならTrue 22 */ 23 public static function SearchClassFile($FilePath) 24 { 25 if (!is_dir($FilePath)) { 26 self::$ClassName = $FilePath; 27 $FilePath = self::$DefaultPath; 28 } 29 30 if ($handle = opendir("$FilePath")) { 31 while (false !== ($Item = readdir($handle))) { 32 if ($Item != "." && $Item != "..") { 33 if (is_dir("$FilePath/$Item")) { 34 self::SearchClassFile("$FilePath/$Item"); 35 } else { 36 if (self::$ClassName == basename($Item, ".php")) { 37 $FileName = "{$FilePath}/{$Item}"; 38 39 if (is_file($FileName)) { 40 require_once $FileName; 41 42 return true; 43 } 44 } 45 } 46 } 47 } 48 closedir($handle); 49 } 50 } 51 52} 53 54spl_autoload_register(array('ClassLoader', 'SearchClassFile')); 55

###エラー
上記を試したエラーは次のものでした。

php

1[12-Jul-2020 06:03:57 UTC] PHP Fatal error: 2Uncaught Error: Class 'JsonSchema\Validator' not found in 3/export/user/b/zjp_56u01y/live_62u457/var/wordpress/wp-content/themes/test/header.php:63

このエラーによればClassが読めていないということらしいので、今度は【header.php】に以下// さらにClassを読むべくこうしたを追加しました。

<?php // Composerが使えないのでこうした require_once DIR_TEMPLATE . '/plugins/Autoloader-master/ClassLoader.php'; // さらにClassを読むべくこうした require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/Validator.php';

ですが今度は以下のエラーとなってしまいます。

php

1[12-Jul-2020 05:01:20 UTC] PHP Fatal error: 2Class 'JsonSchema\Constraints\BaseConstraint' not found in 3/export/user/b/zjp_56u01y/live_62u457/var/wordpress/wp-content/themes/test/plugins/ 4json-schema-master/src/JsonSchema/Validator.php on line 23

このエラーによれば【Validator.php】側の問題のようですが、しかしその問題の行(23行目)は以下の最後の部分でして、これは独自オートローダーによる「自動で必要なものを読んでくれる機能」によって解消されるつもりでしたので、これ以上原因を追えなくなってしまいました。

【Validator.php】

php

1<?php 2 3/* 4 * This file is part of the JsonSchema package. 5 * 6 * For the full copyright and license information, please view the LICENSE 7 * file that was distributed with this source code. 8 */ 9 10namespace JsonSchema; 11 12use JsonSchema\Constraints\BaseConstraint; 13use JsonSchema\Constraints\Constraint; 14 15/** 16 * A JsonSchema Constraint 17 * 18 * @author Robert Schönthal <seroscho@googlemail.com> 19 * @author Bruno Prieto Reis <bruno.p.reis@gmail.com> 20 * 21 * @see README.md 22 */ 23class Validator extends BaseConstraint

独自オートローダーの使い方が間違っているのではないかと思うのですが、どうすればいいのかアドバイスいただけませんでしょうか。
よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

str_replace('',DIRECTORY_SEPARATOR,...)してない
ベースパスに\JsonSchemaまでいらない

php

1spl_autoload_register(function($class){ 2 if(file_exists( 3 $f=DIR_TEMPLATE.'/plugins/json-schema-master/src/'. 4 str_replace('\',DIRECTORY_SEPARATOR,$class).'.php')) 5 {include $f;} 6});

投稿2020/07/16 05:57

KazuhiroHatano

総合スコア7802

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

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

KazuhiroHatano

2020/07/16 06:02

composerのライブラリは必ずしも 名前空間+クラス名がファイルパスに対応しているとは限りません autoloadがpsr-4ではなくfilesだったりclassmapで書かれてる場合だってあります たまたまこのライブラリは大丈夫だったってだけです composerのライブラリは大人しくcomposer使ってautoloadしといたほうがいいです
Citrusxparadi

2020/07/16 08:19

ご回答どうもありがとうございます。以下でよろしいでしょうか。 【header.php】 →試したことのまま 【ClassLoader.php】 →$DefaultPathを質問のように変更せず元のままとし、最後の行のspl_autoload_registerだけをご回答のように変更する。 するとエラーが次のものになり、一歩前進した気がします。 Class 'MabeEnum\Enum' not found in /export/user/b/zjp_56u01y/live_62u457/wordpress/wp-content/themes/test/plugins/ json-schema-master/src/JsonSchema/Enum.php on line 5
Citrusxparadi

2020/07/16 08:20

そして調べてみたのですが、かなり厄介な予感がします。 上のエラーは【Enum.php】にMabeEnumがないということだと思います。 そして【Enum.php】を見たらこの7行だけのファイルでした。 【Enum.php】 <?php namespace JsonSchema; abstract class Enum extends \MabeEnum\Enum { } しかし、上でextends されているMabeEnum.phpというファイルはなんとJsonSchemaのファイルには存在しなかったのです。ググってもそれらしきファイルは見当たらず、これは困りました…。 なにか思い当たることございますでしょうか? 因みにJsonSchemeのDLもとは以下です。 https://github.com/justinrainbow/json-schema.git
KazuhiroHatano

2020/07/16 08:37

https://github.com/justinrainbow/json-schema/blob/master/composer.json "require": { "php": ">=5.3.3", "marc-mabe/php-enum":"^2.0 || ^3.0 || ^4.0", "icecave/parity": "1.0.0" }, 依存ライブラリありますね composerなしでやるなら marc-mabe/php-enumとかicecave/parityとかもDLして autoloadの対象にしてやらんとダメですね この辺りの依存ライブラリの解決も 本来ならcomposerがやってくれること これらのライブラリも他のライブラリに依存してたり いずれかがautoloadがpsr-4じゃなかったりしたら もう諦めてcomposer使えるようにしたほうがいいです 依存ライブラリのcomposer.jsonを見つけて、 autoloadとrequireを確認して、さらにまた依存ライブラリを追いかけての繰り返し リスクも労力もcomposerを使えるようにすることに全く見合いません
KazuhiroHatano

2020/07/16 08:49 編集

Composerを使えるようにするには Macなら以下2行を順番にTerminalで実行するだけです /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" brew install composer composerが使えるようになればあとは それを入れたいディレクトリにcdして composer require justinrainbow/json-schema これだけです
Citrusxparadi

2020/07/18 08:09

お世話になっております。ご返信遅くなりまして申し訳ございません。 あれから人生で何回目かのComposerのインストールに挑戦しましたが…やはりだめでした。教えて頂いた依存ライブラリの方向でまた挑戦してみます。
KazuhiroHatano

2020/07/20 03:12

どこでつまづいてるんでしょう CLIでインストール時にエラーが出てるならちゃんと読んだほうがいいです エラーがあると大概ズラっとメッセージが出力されますが エラーの原因や、場合によっては解決するために 実行すべきコマンドそのものがメッセージにちゃんと書かれてます グローバルインストールされてる何かのライブラリが古くて インストールができないから先にアップデートしてくださいとか 依存ライブラリが古すぎて入手できないから インストールしようとしてるバージョンを見直してくださいとか なんか解決のヒントがメッセージに書かれてるはずです PHPであればライブラリにしろSDKにしろcomposerでインストールというのが もうデファクトスタンダードになってます なんかのAPIとかの公式の開発者向けのドキュメントで PHPのSDKは comoposer install ....を実行してインストールしてください としか書かれてなくて、以降はそのSDKを前提としたコードしか書かれてない ってのはざらです これから先PHPで何か作っていこうとするときに composerは避けられないです PHPを書いてる限りいつかどうにかしなきゃいけない時がきます
guest

0

$DefaultPathに指定するパスを src までにしてください。

php

1private static $DefaultPath = DIR_TEMPLATE . '/plugins/json-schema-master/src';

投稿2020/07/12 10:39

satokei

総合スコア1168

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

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

Citrusxparadi

2020/07/12 11:38

ありがとうございます。エラー内容など変わる様子はございませんでした。何か思いつくことございましたら遠慮なく仰ってください。打つ手なしな状態なのでどんなアドバイスも歓迎です。
satokei

2020/07/12 12:19

独自のAutoloaderは、名前空間に対応しているのでしょうか? 実装を見る限り、対応していなさそうですが...
Citrusxparadi

2020/07/12 12:25

申し訳ございません。名前空間やnewやclassやpublic functionというものを今日知ったばかりで、あまりわかっておりません。それへの対応とはどのようなものになりますでしょうか?
satokei

2020/07/12 12:29

「Composer」を使えるようにした方がよいと思います。
Citrusxparadi

2020/07/12 12:33

アドバイスありがとうございます。独自オートローダーで実行したいのでもう少し頑張ってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問