ラベル PHP の投稿を表示しています。 すべての投稿を表示
ラベル PHP の投稿を表示しています。 すべての投稿を表示

2016年6月15日水曜日

PHPのnamespace と useについて






PHPのライブラリなどで
useやnamespaceといった記述を見かけます。
一体何なんだこれ?
理解しておく必要がありそうです。
理解を深めるためにもまとめておきたいと思います。



namespaceの利用が役立つとき

別なファイルのインスタンスに同じ名前のインスタンスが
ある場合の衝突を避けることができます。


use の利用が役立つとき

namespaceが長い場合
記述画面どうなのでエイリアスを作成し参照できるようになります。


実例をと思いましたが。
簡潔にわかりやすく記載してくれているページがありました。

引用

namespaceを使わない場合に起こりえる問題点を示します。

2つのPHPファイル、lib1.phpとlib2.phpがあるとします。この2つのファイルにはそれぞれFooというクラスと、get_fooというメソッドが定義されていたとします。

・lib1.php

<?php
class Foo {
    public function get_foo() {
        return 'lib1.foo';
    }
}

・lib2.php

<?php
class Foo {
    public function get_foo() {
        return 'lib2.foo';
    }
}

ここで、これらの2つのPHPファイルを読み込んで、Fooクラスのインスタンスを生成してget_fooメソッドを実行してみます。

<?php
require_once 'lib1.php';
require_once 'lib2.php';
$foo = new Foo();
echo $foo->get_foo() . "\n";

すると、以下のようにFatal errorが発生します。

Fatal error: Cannot declare class Foo, because the name is already in use in .../lib2.php on line 3

要は、lib1.phpでFooクラスを定義していて、lib2.phpでもFooクラスを定義しているから、クラス名が重複していて怒られているんですね!

解決方法: namespaceを利用

それでは、先ほどのクラス名が衝突した問題点を、namespaceを使って解決してみます。そのために、lib1.phpとlib2.phpに、namespace xxx;という行を追加します。

・lib1.php

<?php
namespace Lib1;  // これを追加
class Foo {
    public function get_foo() {
        return 'lib1.foo';
    }
}

・lib2.php

<?php
namespace Lib2;  // これを追加
class Foo {
    public function get_foo() {
        return 'lib2.foo';
    }
}

そして、これら2つのファイルを読み込んで、先ほどと同様にget_fooメソッドを実行してみます。

先ほどの例だと、Fooクラスのインスタンスを生成するときに、$foo = new Foo();としました。今回は、lib1.phpとlib2.phpにnamespaceを追加したので、lib1.phpのFooクラスのインスタンスを生成は$foo = new Lib1\Foo()と書くことができます。また、lib2.phpのFooクラスのインスタンスは$foo = new Lib2\Foo()で生成できます。

<?php
require_once 'lib1.php';
require_once 'lib2.php';
// $foo = new Foo();
$foo = new Lib1\Foo();
echo $foo->get_foo() . "\n";  // 「lib1.foo」と出力します。

$foo = new Lib2\Foo();
echo $foo->get_foo() . "\n";  // 「lib2.foo」と出力します。

つまり、lib1.phpとlib2.phpにnamespaceを指定したので、同じFooクラスでも、Lib1というnamespace(名前空間)に属するFooクラスと、Lib2というnamespaceに属するFooクラスで、区別できるようになったということです。これで、クラス名の衝突による問題は解決できました!

useでエイリアスを作成

最後にuseを使用してみます。その前に、lib1.phpを修正します。具体的には、namespaceを長くして、Foo2クラスとFoo3クラスを追加してみます。(※これ以降、lib2.phpはでてきません。)

・lib1.php

<?php
namespace Foo\Bar\Baz\Lib1;  // 長い。。。
class Foo {
    public function get_foo() {
        return 'lib1.foo';
    }
}

class Foo2 {
    public function get_foo() {
        return 'lib1.foo2';
    }
}

class Foo3 {
    public function get_foo() {
        return 'lib1.foo3';
    }
}

先ほどのnamespaceの例のように、lib1.phpを読み込むと、FooクラスはFoo\Bar\Baz\Lib1\Foo、Foo2クラスはFoo\Bar\Baz\Lib1\Foo2、Foo3クラスはFoo\Bar\Baz\Lib1\Foo3でアクセスすることができます。

<?php
require_once 'lib1.php';
$foo = new Foo\Bar\Baz\Lib1\Foo();
$foo2 = new Foo\Bar\Baz\Lib1\Foo2();
$foo3 = new Foo\Bar\Baz\Lib1\Foo3();
echo $foo->get_foo() . "\n";  // 「lib1.foo」と出力します。
echo $foo2->get_foo() . "\n";  // 「lib1.foo2」と出力します。
echo $foo3->get_foo() . "\n";  // 「lib1.foo3」と出力します。

なんだか、Foo\Bar\Baz\Lib1\がいっぱい出現して、面倒な感じですよね。。。

ここで登場するのがuseです。useを使うと、Foo\Bar\Baz\Lib1というnamespace(名前空間)のエイリアスを作成し、Lib1で参照できるようになります!先ほどのコードはuseを使って、以下のように修正できます。

<?php
require_once 'lib1.php';
/*
$foo = new Foo\Bar\Baz\Lib1\Foo();
$foo2 = new Foo\Bar\Baz\Lib1\Foo2();
$foo3 = new Foo\Bar\Baz\Lib1\Foo3();
*/
use Foo\Bar\Baz\Lib1 as Lib1;  // Foo\Bar\Baz\Lib1を、Lib1で参照できるようにエイリアスを作成します。
$foo = new Lib1\Foo();
$foo2 = new Lib1\Foo2();
$foo3 = new Lib1\Foo3();
echo $foo->get_foo() . "\n";  // 「lib1.foo」と出力します。
echo $foo2->get_foo() . "\n";  // 「lib1.foo2」と出力します。
echo $foo3->get_foo() . "\n";  // 「lib1.foo3」と出力します。

useを使ってエイリアスを作成したら、コードがすっきりしました!

ちなみに、この例だとuseのas以降を省略することもできます。(※asを使うと、作成するエイリアスの名前をLib1以外にすることができます。)

// use Foo\Bar\Baz\Lib1 as Lib1;
use Foo\Bar\Baz\Lib1;

また、エイリアスでnamespaceだけではなくて、クラスなどのエイリアスも作成することができます。

use Foo\Bar\Baz\Lib1\Foo;
use Foo\Bar\Baz\Lib1\Foo2;
use Foo\Bar\Baz\Lib1\Foo3;
// PHP7以降は以下の記述も使えます。※asの省略も可能です。
// use Foo\Bar\Baz\Lib1\{Foo as Foo, Foo2 as Foo2, Foo3 as Foo3};
$foo = new Foo();
$foo2 = new Foo2();
$foo3 = new Foo3();


引用:https://remotestance.com/blog/3064/

2013年10月30日水曜日

SmartyでURLエンコードする記載



Smartyでurlencodeできるのか?
調べてみると。
Smartyのサイトにescape 変数の修飾子についての記載があります。

escape を利用する

escape は変数のエンコードやエスケープを行います。
たとえば html、 url、シングルクォート、 hex、hexentity、 javascript および mail などに対する処理を行います。
デフォルトでは html 用の処理をします。

例題がもっと明確のほうがいいですよね。
自分がやりたいことは

エンコード前
SMARTYでURLENCODEしたい。

エンコード後
SMARTY%e3%81%a7URLENCODE%e3%81%97%e3%81%9f%e3%81%84%e3%80%82

となるようにSmarty でURLエンコードをしたい。


Smarty でURLエンコードする

{$変数|escape:”エスケープの種類を指定”}
と記載する
自分の場合は、エスケープの種類でurlを指定すればurlencodeできました
{$data.word|escape:'url'}



ちなみに
エンコード⇒デコードを確認するのは、こちらのページが便利です。
http://www.tagindex.com/tool/url.html

2013年10月12日土曜日

.htaccess拡張子なしでアクセスできるようにする



URLは短いほうが覚えてもらいやすいので
拡張子などもなくしてしまったほうがいいかと思ったりする場合
.htaccessをつかってその方法を記しておきます。

例:phpの拡張し無しでアクセスできるようする。


phpの拡張し無しでアクセスできるようする

http://www.example.co.jp/a.php



http://www.example.co.jp/a

でも同じように表示されるようにする.htaceess
の記載方法

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php
3行目、4行目の php 部分を他の拡張子(htmlなど)に変えれば
拡張子なしでもアクセスできるようになります。
拡張しが付けたままのURLでもアクセスできます。

2013年10月8日火曜日

フォームの送信データを検証するための便利で軽量なライブラリ「GUMP」



GUMP はフォームから入力されたデータを検証し
フィルタリングできるPHPクラスです。

パスワードや文字数の数
メール、性別、クレジットカード
など入力されるデータを検証することができます。

フレームワークを使うほどではないけど
小さなWEBサイトでデータの入力などがある場合
これは便利ではないでしょうか?

独自の関数も追加できて
データベースに既に登録されているメールがあった場合は
エラーメッセージを出すなど
メールチェックも独自の関数を追加できます。

エラーメッセージを日本語に変えることもできます。




使い方もシンプルで簡単
require "gump.class.php";

$is_valid = GUMP::is_valid($_POST, array(
'username' => 'required|alpha_numeric',
'password' => 'required|max_len,100|min_len,6'
));

if($is_valid === true) {
// continue
} else {
print_r($is_valid);
}

https://github.com/Wixel/GUMP

2013年10月7日月曜日

これは便利プログラムサンプルと動作をみれる「Runnable」



WEB制作をする際、何かプログラムを書くことがあります。
プログラムを書く場合は、0から書くことはあまりなく

自分が書いたこれまでのプログラムを探して必要な部分を
コピーしたり
実現したい内容を既にした人はいるだろうという前提で
似たものがないかとgoogleやgithubで探すことが多いとおもいます。


Runnableは、
検証済みコードをPHPやJavaScriptなどの言語や
フレームワーク毎にとめられてテーマ別に公開されており実行できて
試せるようになっている。



PHPとJqueryを使ってformの検証するプログラムを書く


たとえば、PHPとJqueryを使ってformの検証するプログラムを書く場合。
(最近、書いたことがあったもので。)

runnableには

How to validate forms in jQuery [validation]

とまさにぴったりの項目があり。
サンプルソースが公開されています。

そのソースを動かして、
動作を確認することも出来ます。

これをコピーして
すこしカスタマイズして
制作しているWEBにすぐ活かすことができる。

現在はまだ少ないが登録者が増えて
いろいろなコードがあっぷされたら
どんどん便利になりそうだ。


Runnable
http://runnable.com/

2013年10月5日土曜日

98.95%のロード時間を短縮、画像キャッシュと圧縮可能なPHPライブラリ「PHP Image Cache」




PHP Image Cache は小さなPHPクラスで
JPG 、PNG 、GIFの画像扱え
ユーザーが使用しているブラウザにおいて
画像を圧縮、移動、キャッシュが行え、
新しいイメージがある場合にはその画像を返すことができます。

このPHP Image Cacheを使うことで
98.95%のロードタイムの短縮が可能なったそうです。

画像を多様したWEBサイトを作成の方は
このPHPクラスを利用することで
ページの速度が速くなるのではなでしょうか?

ページの表示速度が速いほうがユーザビリティやコンバージョン率が
向上するのことは明白で、Googleも推奨しています。
ちなみにGoogleのウェブマスターツールでは
「サイトのパフォーマンス」で管理サイトの表示速度を知ることができます。

PHP Image Cache

PHP Image Cacheのインストール
使い方など、詳細こちら
PHP Image Cache

2013年10月4日金曜日

PHPでRSSを簡単に生成できるFeedCreater

PHPでRSSを簡単に生成できるFeedCreater



Google ReaderがなくなってRSSが下火になってきている
なんて噂も聞きますが
RSSは非常に便利です。
更新情報をいちいちサイトにアクセスしなくても
feedlyなどのフィードを登録しておけば
まとめて情報を閲覧できます。

いろいろ更新があるWEBサイトをもっているなら
RSSを出力しておいたほうが訪問者が増加につながっていいとおもいます。

RSSを出力するにあたってPHPで簡単に出力できるクラスが
ありますので紹介します。

関連時事

人気の投稿