Tag Archives: クラス

[PHP]ヒアドキュメント内で関数を使う

Facebook にシェア
Delicious にシェア
LINEで送る
Pocket

PHP で HTML などを複数行表示させたい時、ヒアドキュメントを用いることが多いですが、
出力時に htmlspecialchars() 等の関数を使っておく必要が有る場合が殆どで、
現実的には次のようなソースになってしまいます。

<?php
//実際には動作しません
$str1 = getSomeText();
$str2 = getSomeText();

$str1 = htmlspecialchars($str1, ENT_QUOTES);
$str2 = htmlspecialchars($str2, ENT_QUOTES);

echo <<<EOD
<p>{$str1}</p>
<p>{$str2}</p>
EOD;
exit;

「<p>{htmlspecialchars($str1)}</p>」のように出来れば楽なのですが、ヒアドキュメント内で関数は直接使えないため、
前もって処理しておく必要があります。
例では2つしか無いのでこれでもいいですが、何十個も処理するのはあまり綺麗とはいえません。

解決方法は2つあり、ひとつはこちらの記事(http://blog.half-moon.org/archives/390)で知ったメンバ関数を経由する方法です。

<?php
class Foo {
  function h($str){
    return htmlspecialchars($str, ENT_QUOTES);
  }
}

$foo = new Foo();
$str = "<'sample'>";
echo <<<EOD
	<p>{$foo->h($str)}</p>
EOD;
exit;

このようにするとメンバ関数は展開されるので見た目をすっきり書くことができます。

もう一つは可変変数を使う方法です

<?php
$h='htmlspecialchars';
$str = "<'test'>";
echo <<<EOD
<p>{$h($str, ENT_QUOTES)}</p>
EOD;
exit;

クラスを作らなくていい分短いソースでできますが、
なんとなく落ち着かないのは私だけでしょうか?

どちらの方法もややトリッキーな方法であるため、複数人で作業する場合などは
通常通り出力前に変換しておく方法をとったほうが無難かもしれません。
あくまでこういう方法もあるという紹介にとどめておきます。

Posted in PHP | Tagged , , | Leave a comment

[PHP]クラスの基礎 メンバ変数とメンバ関数

Facebook にシェア
Delicious にシェア
LINEで送る
Pocket

大規模なPHPプログラムでは必須になってくる Class なのですが、
今ひとつピンとこないので基礎からおさらいしてみようと思います。

クラスはプロパティ(メンバ変数)とメソッド(メンバ関数)を持ち、
複数の関数をひとつのグループにまとめることができます。

メンバ変数はクラス内のメンバ関数で共有して利用できる変数で、
アクセス権によって3種類に分類されます。

「public」はクラスの中でも外でも利用できます。
具体的には下記のように使います。

<?php
class Test{
    public $foo = 123;
}

$test = new Test();
echo $test->foo;

「private」はそのクラス内でしか利用できません。
上のソースの public を private に変えてみるとエラーが出るのがわかります。
private は次のように用います。

<?php
class Test{
    private $foo = 123;

    function abc(){
        echo $this->foo;
    }
}

$test = new Test();
$test->abc();

「$this」って何?と思われるかもしれませんが、これはオブジェクト自身を指す変数です。
「echo $foo;」のようにはできないので気をつけて下さい。

3つ目は「protected」です。
こちらもクラス内でしか使えませんが、継承した子クラスからはアクセスできる権限です。

<?php
class Test{
  protected $foo = 123;
}

class Example extends Test {
  function abc(){
    echo $this->foo;
  }
}

$example = new Example();
$example->abc();

子クラスは「class 子クラス名 extends 親クラス {}」の形で定義します
子クラスは親クラスのすべてのメソッドを受け継ぐ(継承)ので、子クラスの中でも
親クラスで定義したメソッドを利用できます。

「protected」は子クラスからでもアクセスできるのに対して、
「private」はそのクラス内でしか利用できないので、上のソースを「private」に
書き換えるとエラーが発生します。

Posted in PHP | Tagged , , | Leave a comment