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

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

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

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

Q&A

解決済

1回答

1431閲覧

コールバック関数で呼び出したメソッドの引数について

toll_tree

総合スコア199

PHP

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

0グッド

0クリップ

投稿2019/04/23 03:57

編集2019/04/23 03:57

パーフェクトPHP第7章を学習しているのですが、分からない部分があった為、ご質問させて貰いました。
下記はオートロードに関する処理をまとめた、「ClassLoader.php」です

php

1<?php 2class ClassLoader 3{ 4 protected $dirs; 5 public function register() 6 { 7 spl_autoload_register(array($this,'loadClass')); 8 9 } 10 public function registerDir($dir) 11 { 12 $this->dir[] = $dir; 13 14 } 15 16 public function loadClass($class) 17 { 18 foreach($this->dirs as $dir){ 19 $file = $dir . '/' . $class . '.php'; 20 if(is_readable($file)){ 21 require $file; 22 return; 23 } 24 } 25 } 26}

下記は、ClassLoaderをオートロードに登録する為の「bootstrap.php」です。

php

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

上記の「bootstrap.php」の「$loader->register()」では、registerメソッドを呼び出していますが、結果的に、「spl_autoloader_register」によって、「loadClass」メソッドが呼び出されますが、ここの引数$classはどうなるのでしょうか?
通常、メソッドを呼び出す際は、仮引数が存在していた場合、loadClass('test')などのように実引数を指定するものと思いますが、「spl_autoload_register」で呼び出した場合は、引数はどうなるのでしょうか?
ご教示頂けましたら幸いです。

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

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

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

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

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

m.ts10806

2019/04/23 04:02

前の質問の回答があまり活きてないような・・・。 spl_autoload_register()が利用する__autoload()の仕組みを理解する必要があるということなのですが・・。
m.ts10806

2019/04/23 05:40

一応、回答はしました。ご確認ください。
guest

回答1

0

ベストアンサー

spl_autoload_register()
:指定した関数を __autoload() の実装として登録する

__autoload()
:未定義のクラスのロードを試みる

つまり、__autoload()の実装として登録されたため、未定義クラスが呼び出されると自動でspl_autoload_register()に指定した関数が呼び出され、自動で引数に未定義クラスのクラス名が渡されます。

ですが、__autoload()の説明にあるようにこの機能は PHP 7.2.0 で 非推奨になります。この機能に頼らないことを強く推奨します。となっています。
非推奨になるということは近い将来のPHPでは削除される機能ということになります。
そこまで踏み込むのでしたらcomposerを導入したほうが有用で、開発を進める上では効率的と言えます。

ちなみにcomposer内部でもspl_autoload_register()から__autoload()が呼び出されるようになってはいますが、

php

1 public static function Register() 2 { 3 if (function_exists('__autoload')) { 4 // Register any existing autoloader function with SPL, so we don't get any clashes 5 spl_autoload_register('__autoload'); 6 } 7 // Register ourselves with SPL 8 return spl_autoload_register(['Complex\Autoloader', 'Load']); 9 }

function_exists()によって非推奨→削除になっても対応できるように分岐し、自身が持つload機能を利用するようになっています。


追記:
ある程度はPHPマニュアルに書いてある内容で「そういうもの」と割り切って進めるのは必要だと思います。
※内部仕様まで突っ込んで確認したいのでしたら原本ソース(C言語)を読み込んでください
https://github.com/php/php-src

投稿2019/04/23 04:22

編集2019/04/23 05:40
m.ts10806

総合スコア80850

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

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

toll_tree

2019/04/23 07:02

ご回答ありがとうございます。 ご回答頂きましたおかげで、大分理解が進みました。 >自動で引数に未定義クラスのクラス名が渡されます。 ここなのですが、今回のコードですと未定義クラスのクラス名というのは、「$loader->registerDir(dirname(__FILE__) . '/core');」「$loader->registerDir(dirname(__FILE__) . '/models');」ここの2行で指定しているディレクトリの中にある、クラス名のことなのでしょうか?
m.ts10806

2019/04/23 07:04

そこはloadClass()内にわたってきている変数やプロパティの値をデバッグしてみるとわかりますよ。
toll_tree

2019/04/23 07:26

分かりました。一度、coreディレクトリに及び、modelsディレクトリにクラスを作り、試してみたいと思います。
m.ts10806

2019/04/23 07:27

存在しなかったら存在しなかったでどういう挙動になるのか確認しておくのも理解の助けになると思います。
toll_tree

2019/04/23 08:49

ですよね... なんですけど、正直今の所パーフェクトPHPを学ぶべきなのかなと迷っております。というのも、フレームワークの勉強としてlalavelの勉強を始めようかと思っていたので、いっそのことそっちをやろうかなと... 正直、分からないことが多く、このまま勉強を続けていてもためになるのかなと...
toll_tree

2019/04/23 09:05

パーフェクトPHPの7章、全て理解せずとも、大まかに理解ができていれば、大丈夫ですかね...?
m.ts10806

2019/04/23 09:15

もしかしたら誤解させたかもしれませんが「存在しなかったら」は各ディレクトリ、ファイルの話です。 Laravelだと結局はcomposerになりますが公式ドキュメントは充実していますし、composer自体は基本操作さえ覚えればおおよそ、あとはガリガリコードを書いていくだけにはなります。 ただ「Web職人のためのフレームワーク」という謳い文句にあるとおり、若干他の既存フレームワークよりも学習コストが高めという印象です。 名前空間なども含めた実践的なオブジェクト指向が身に付いていないと厳しいところはあるんじゃないかなと思います。 PHP7.2以上が対象なのでPHP7の書き方にも慣れる必要があります。 オブジェクト指向の実践についてはパーフェクトPHPでも身に付くところでもあるので重点的にやっておいたほうが良さそうです。 あと「フレームワークとは」というところの概念はおさえておいても良いかもしれません。 (理想はオレオレフレームワークでも作れるところ…ですが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問