継承先クラスにコンストラクタを作るときの注意

こんなことをしてしまうと、継承元のコンストラクタが無効になってしまうので注意。
どうしても継承先でコンストラクタを使用したい場合は、
明示的に継承元のコンストラクタを起動する。

例えば継承元のコンストラクタが「Database」という名前で、継承先のコンストラクタが「Database2」だった場合は、以下のようにする。ちなみに、この仕様はPHP4のものを前提にしているが、PHP5でも有効に動く。ただし、PHP5純正の方式では、コンストラクタの命名方法が異なるらしい(調べてない)。

function Database2($option) {

  parent::Database($option);

}

これでOK。引数を橋渡ししたい場合も、すでにDatabase2では取得しているはずなので、そのまま引き渡せば大丈夫。

autoloadのスクリプトをhtaccessでロード

PHPでクラスを使う場合、クラス・ファイルをいちいちrequireしないといけないわけで、それをスクリプトに書き忘れると、PHPに怒られるわけ。
でも、わしって時々ファイル名を変えたくなる衝動に駆られるもんで、
その度にrequireしているファイル名を修正するのが面倒になる。
一つのファイルにまとめてrequire記述して、そのファイルを読みこめばいいじゃんってご意見もあるだろうが、それだと、全部のクラスをロードすることになって、あるスクリプトでは使うけど、こっちでは使わないって場合、すごく無駄なロードをするはめになるわけだ。

そこで、クラスのrequireを一切しないですむ方法が、auto_prepend_fileってわけです。

まずは下記のfunctionを記述したPHPファイルを作る。この場合のファイル名はなんでも良い。
ここでは便宜上「autoloder.php」としておく。
ただし、クラスファイルのファイル名には、クラス名を含ませておく必要がある。
$className という関数は、読み込んでいないクラス名が自動で取得されるが、
そのクラス名を元に読み込むファイルを紐付ける必要があるためだ。
例えば、「Database」というクラスを自動読み込みの場合は、
「/your/root/path内にあるDatabase.class.phpをrequireする」という動作をする。

function __autoload($className) {

  $class_path = "/your/root/path/";
  $fileName = $class_path . $className . '.class.php';
  if (is_file($fileName)) {
    require $fileName;
  }else{
    #ロードできない場合のエラー表示
    echo "[unloded]" , $fileName;
  }
}

次に.htaccessに下記のコマンドを記述します。

ファイル名の部分に、上記で作成したファイルの名前を記述。

<IfModule mod_php5.c>
  php_value auto_prepend_file "ファイル名"
</IfModule>

こうすることにより、php実行時に、そのスクリプトで利用するクラスがロードされていない時は、

自動でそのクラスを読み込んでくれるはず。

PHP の実行している OS の種類を取得する方法

どんなOSでも動くPHPシステムを構築する場合、
設定ファイル用意しておいて、OS固有の設定をすればいいだけなんだけど、
例えばファイルパスの書き方とか、linuxとwindowsでは違うわけで、
そういう細かい処理を自動でできればと思った次第です。
例えばPHPとMYSQLは同じでも、windowsで開発してlinuxで公開するとか。

で、PHPにはそれらを手助けしてくれる定数がある。

DIRECTORY_SEPARATOR; // ディレクトリの区切り文字
PATH_SEPARATOR; // パスの区切り文字

これと、OSを取得する定数「PHP_OS」を使えば、
ファイルパスを気にする必要もなくなる。

PHP_OSで

<?php
 if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
   echo 'このサーバーは Windows です!';
 } else {
   echo 'このサーバーは Windows ではありません!';
 }
?>

 

早く実装せねば。

配列から値のない要素を取り除く

・値のない要素を除いた配列を作りたい。
・連想配列の場合はキーは維持し、普通の配列の場合は詰める。

function array_tidy ($array, $unique=false) {
  if(!is_array($array)) return $array;
  $assoc = (array_keys($array)!==range(0, count($array)-1)) ? true : false;
  $array = ($unique) ? array_unique($array) : $array;
  $array = array_diff($array, array('',null)) ;
  return ($assoc) ? $array : array_values($array);
}

 

参考サイト
SIMPLERAIGHT