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

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

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

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

Q&A

解決済

1回答

1937閲覧

[PHP] __callStaticで詰んでいます。

yoshiky

総合スコア105

PHP

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

0グッド

0クリップ

投稿2015/12/14 10:16

お世話になってます。
PHPの__callStaticで定義された関数を呼ぶにあたり、

publicとprivateの中でそれぞれ呼ぼうとしたら「Cannot redeclare」の定義済みエラーになってしまいました。

しかし先に呼ばれる箇所にのみ書くようにすると、今度は2番目以降で「Call to a member function xxx on a non-object in」と、未定義扱いになってしまいます。。

PHPに詳しくないので基本的なミスかもしれませんが、
些細な点でもかまわないので、アドバイスいただきたく、お願いいたします。
情報が不足していたら追記します。取り急ぎ、対象のソースです。

php

1 2class libCrypt 3{ 4 public static function __callStatic($class, $args) 5 { 6 function exeClassAutoLoad($class) { 7 require_once("$class"."php"); 8 } 9 spl_autoload_register("exeClassAutoLoad"); 10 return new $class($args[0]); 11 } 12}

php

1 2class Point extends My_Controller 3{ 4 5 public function Hoge() 6 { 7 $objCrypt = libCrypt::Aes256Cbc('sec_key'); # Aes256Cbc が上の$classにあたります。 8 $strDeCrypt = $objCrypt->exeEnCrypt($fuga); #exeDeCrypt はAes256Cbcにpublicで定義しているメソッドです。 9 ・・・ 10 $this->_bar($data); 11 } 12 13 private function _bar($data) 14 { 15 $objCrypt = libCrypt::Aes256Cbc('sec_key'); # これを書くとPHP Fatal error: Cannot redeclare exeClassAutoLoad() 16 $strDeCrypt = $objCrypt->exeDeCrypt($data); # 上を書かないとここで Call to a member function exeDeCrypt() on a non-object 17 } 18

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

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

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

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

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

guest

回答1

0

ベストアンサー

spl_autoload_register を使う必要ないと思います。
__callStatic が直接 require_once すれば大丈夫です。

php

1class libCrypt 2{ 3 public static function __callStatic($class, $args) 4 { 5 require_once("$class"."php"); // ちなみにこれ、ドットが入らないと思いますが大丈夫ですか 6 return new $class($args[0]); 7 } 8}

投稿2015/12/14 10:40

tozjp

総合スコア790

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

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

yoshiky

2015/12/14 10:53

早速のご回答ありがとうございます! ご指摘のとおりspl_autoload_registerを外したら2回呼んでも エラーになりませんでした。 これで確認してみます。助かりました。ありがとうございました。 > // ちなみにこれ、ドットが入らないと思いますが大丈夫ですか こちらは require_once($class.".php"); でした。質問にあたり間引いた箇所ですので問題なしです。 ご指摘ありがとうございます。
tozjp

2015/12/14 10:59

あ、いやでも spl_autoload_register は、正しく使えば便利です。 使い方を学んでおくに越したことはありません。 spl_autoload_register はご提示のコードのように、クラスをインクルードしたい時にインクルードするための処理を「自分で」呼び出す必要が無いことがメリットです。 つまり、libCrypt::__callStatic というクラスをロードするための処理をいちいち実行しなければならないようにしてしまうと、全然有り難みを享受できません。 // 一旦関数宣言せずに書くこともできます。 spl_autoload_register(function($className) { $className = str_replace('\\', DIRECTORY_SEPARATOR, $className); // 一応 \ は / にしておく。 include $className . ".php"; }); これをすべてのコードの前で1回だけ実行すれば、普通にクラスを作ろうとした時点で勝手にインクルードされます。 ストレートに $objCrypt = new Aes256Cbc('sec_key'); と書けます。 うまくいかない場合は、インクルードパスの問題かもしれません。 http://php.net/manual/ja/function.get-include-path.php
yoshiky

2015/12/15 01:06

アドバイスありがとうございます! __callStaticとspl_autoload_registerはともに「未定義関数にアクセスした際に呼ばれる」という程度の理解なので、使い方までご提示いただけて助かります。 > これをすべてのコードの前で1回だけ実行すれば、普通にクラスを作ろうとした時点で勝手にインクルードされます。 ほかのクラスでも使う箇所が多そうなので、簡単に使えるようにしておいたほうがいいですね。検討します!
tozjp

2015/12/16 05:49

あ、細かいのですが、 > __callStaticとspl_autoload_registerはともに「未定義関数にアクセスした際に呼ばれる」という程度の理解 __callStatic の対象は未定義ではなく、アクセス不能なメソッドです。 private 宣言されたものを外から呼んだ時が含まれます。 spl_autoload_register は関数とは無関係です。未定義のクラスのみです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問