2011年6月14日火曜日

PHP4とPHP5のコンストラクタの動作の違い

PHP4からPHP5へのオブジェクト関連の変更でマジックメソッドが追加されてますが、このマジックメソッドの仕様は不思議な動作をするようでたまに問題が指摘されてます。
多分に漏れず、初心者がはまりそうな部分を書いておきます。

__constructによるコンストラクタの継承による不具合発生。

PHP4までの親コンストラクタの継承は「$this->親クラス名」で継承されていましたが__constructで書こうとすると思わぬエラーが出ることがあります。

Smartyの拡張セットアップも「$this->Smarty();」となっていますね。
http://www.smarty.net/docsv2/ja/installing.smarty.extended.tpl

これを「parent::__construct()」で継承するまではいいのですが、親コンストラクタのほうを__constructに変更するとエラーが出ます。

class Test {
 public function __construct() {
  echo "Testコンストラクタです\n";
 }
}

class TestChild extends Test {
 public function __construct() {
  $this->Test(); //エラー
  echo "TestChildのコンストラクタです\n";
 }
}


冷静に考えれば$thisで親コンストラクタを呼び出すこと自体変なので、新しい親コンストラクタは「parent::__construct()」で呼び出してください。

class Test {
 public function __construct() {
  echo "Testコンストラクタです\n";
 }
/*
        //古い書き方であっても大丈夫です
 public function Test() { 
  echo "Testオブジェクトを生成します\n";
 }
*/
}

class TestChild extends Test {
 public function __construct() {
  parent::__construct();
  echo "TestChildのコンストラクタです\n";
 }
}


であれば親が古い書き方であってもエラーは出ません。

2011年6月12日日曜日

PleiadesからPerlでCGIを動かす(Windows7)

PleiadesはEclipseの豊富な機能を一度に纏めてインストールしてくれるとても便利なIDEですね。
 そこでPHP開発などもPleiadesで開発している人も居ると思われます。特にZen Codingがプラグインが登場してからはIDEでもかなり生産性は高くなったのではないでしょうか?

PHPはデフォルトでドキュメントルートからそのまま拡張子を.phpにすれば表示されます。

Perlもパスを通せばドキュメントルートからでも可能ですが、cgi-binフォルダはCGI専用のフォルダなので分けて開発しておくと後々便利ではないでしょうか?

PleiadasAll in Oneですと
/pleiades/xampp/htdocsがデフォルトのドキュメントルートになっています。
 
Apacheの設定ファイルである。
 /pleiades/xampp/apache/conf/httpd.confDocumentRootに設定してありますので確認してください。

ScriptAliasはCGIを動作できるフォルダを指定するためのものです。
/cgi-bin/とあればcgi-binフォルダから動作出来るはずです。

/pleiades/xampp/cgi-binフォルダにprintenv.plと言うファイルが有るはずなのでそのファイルを
http://localhost/cgi-bin/printenv.plで開いてみましょう。 表示されれば、動作確認OKです。

拡張子が「pl」でしたがCGIの拡張子は通常「cgi」なので適宜Apacheで設定してください。

■ CGIをEPICで開発する
せっかくPleiadesを使用しているのでPerl環境もEclipseから開発したい人も
Eclipseの[ヘルプ]から[新規ソフトウェアからインストール・・]で[追加]ボタンをクリック、そこで現れるダイアログで名前に「EPIC」、ロケーションに「http://www.epic-ide.org/updates/」を入れてください。

urlが正しく入力されれば、EPICがチェック出来るようになるのでチェックボックスに入れて「次へ」からインストール出来ます。

これでEclipseからPerlの開発環境が整いました。
IDEは重くて嫌だと言う人もZen Codingとの組み合わせなら十分メリットはあると思います。

■ Hello Worldファイルを作る。
自分のファイルで確認するためと日本語表示確認のために作ってみます。
先程のprintenv.plと同じくcgi-binフォルダ以下に配置してください。

例:
#! "C:/dev/pleiades/xampp/perl/bin/perl.exe"
print "Content-type: text/html; charset=utf-8\n\n";
print "

Hello, World.日本語表示

\n";

気をつけることはパスはperlのある場所にダイレクトに指定することです。
Pleiadesでは、/pleiades/xampp/perl/bin/perl.exeにあります。
Strawberry perlならその位置を指定してください。

正確に表示されれば成功です。

2011年6月8日水曜日

jQueryのempty()とremove()

jQueryは似たようなセレクターやメソッドがいくつか存在しますが、比べてみることでその違いをはっきりさせておくと覚え易いです。

empty()メソッドとremove()メソッドの違い。
  • empty()は中身を削除する。
  • remove()はそのもの本体ごと削除する。
  • remove([exp])でセレクターの条件にあったものだけ削除されます。

例:
html

jQuery(empty and remove)

  • 1.Text
  • 2.TextStrongTextTextEm
  • 3.TextStrongText
  • 4.TextiTextText

cssは分かりやすいように色付け(お好みで)

li {
  background-color: lavender;
  border: 1px solid royalblue;
  height: auto;
  width : 400px;
  padding: 5px; 
}

strong {
  background-color: seashell;
  border: 1px solid fuchsia;
}

em {
  background-color: beige;
  border: 1px solid chocolate;
}

i {
  background-color: lightsalmon;
  border: 1px solid tomato;
}


jQuery部分
empty()とremove()とremove([exp])で変化を見ます
jQuery(function() {
 //liにempty()を適用します
 $("#btn1").click(function() {
  $('li').empty();
 }); 
 //liにremove()を適用します
 $("#btn2").click(function() {
  $('li').remove();
 }); 
 //em要素が含まれるliにremove()が適用されます
 $("#btn3").click(function() {
  $('li').remove(':has(em)');
 }); 
 //文字列[Strong]が含まれるliにremove()が適用されます
 $("#btn4").click(function() {
  $('li').remove(':contains("Strong")');
 });
});

初期状態

empty()を使用した場合

remove()を使用した場合

remove(':has(em)')を使用した場合

remove(':contains("Strong")')を使用した場合

2011年6月6日月曜日

SQLite関数で「file is encrypted or is not a database」というエラーが出る場合

PHPのsqlite_open関数でSQLiteのデータベースを開こうとしたら「file is encrypted or is not a database」というエラーが出ました。
直訳すると「ファイルは暗号化されているか、データベースではないです」ということ。

どうやらSQLiteの互換性の問題のようです。
SQLite3とそれ以前のSQLiteはかなり異なった設計なのでPHPの旧関数は使えない模様。
PDOで開けば解決します。

データベース開くのに固有の関数はよろしくないですね。
ただし、テストなど色々試したい場合があると思いますので一応メモです。

PHP5でも組み込まれているのがSQLite2.8などの場合があります、そうすると思わぬ互換性問題が発生しますのでお気をつけを。

2011年6月3日金曜日

Firefoxでハマリそうなこと1(innerTextはFirefoxでは使えない)

FirefoxではinnerTextでエラーが出た方も多いかも。
代わりにtextContentを使用します。
使ってないと忘れてしまいがちなのでメモ。

if(element.innerText) { //IE
     element.innerText = "文字列";
}else { //Firefox
     element.textContent = "文字列";
}