Category Archives: PHP

[PHP]次の土日(今週末)の日時を取得する

Share on Facebook
Bookmark this on Delicious
LINEで送る
Pocket

PHP で日付を扱う場合は基本的に DateTime クラスを使いますが、add() などを使って日時を操作するとオブジェクト自身が書き換えられてしまうため計算結果だけが欲しいという場合には向きません。
そのような場合 DateTimeImmutable クラスを使うと add() した場合新しい DateTimeImmutable オブジェクトを返すのでもともとのオブジェクトの日時を書き換えることなく日時計算の結果だけを取得できます。

<?php
$now = new DateTimeImmutable();    // 今日
$w = (int)$now->format('w');
$diff = 6 - $w;

$sat = $now->add(new DateInterval('P' . $diff . 'D'));
$sun = $now->add(new DateInterval('P' . ($diff + 1)  . 'D'));

echo $sat->format('Y-m-d');    // 土曜日
echo $sun->format('Y-m-d');    // 日曜日

ちなみに今日の日付などが DateTime オブジェクトの形で与えられている場合、次のようにして変換することも出来ます。

$date = new DateTime();
$mutable = DateTimeImmutable::createFromMutable( $date );

Posted in PHP | Tagged , | Leave a comment

[PHP]クラスのプライベートなプロパティやメソッドに外部からアクセスする

Share on Facebook
Bookmark this on Delicious
LINEで送る
Pocket

通常 private や protected に指定されているクラスのプロパティやメソッドを読み書きしたり実行したりすることは出来ません。
しかしテストの際などに一時的にその制限を無視してアクセスしたい場合もあります。そういったときは ReflectionClass を使うことで実現できます。

<?php
class MyClass
{
    private $foo = "";

    private function bar($str){
        return $str . "!";
    }
}

$myClass = new MyClass();

$refrection = new ReflectionClass(get_class($myClass));

// プロパティの読み書き
$foo = $refrection->getProperty('foo');
$foo->setAccessible(true);
$foo->setValue($myClass, "Hello"); // 書き込み
echo $foo->getValue($myClass); // 読み取り

// メソッドの実行
$bar = $refrection->getMethod('bar');
$bar->setAccessible(true);
echo $bar->invoke($myClass, "World");

プロパティに対しては getProperty()、メソッドに対しては getMethod() を使い、setAccessible(true) でアクセスできるようにします。

基本的には private や protected に指定されているということは外部からアクセスされたくない、書き換えられると破損するおそれがあるということですので、このようなリフレクションを使う際は内容を十分に把握し、本当に必要なときだけ利用するようにして下さい。

公式マニュアル:
PHP: リフレクション

Posted in PHP | Tagged | Leave a comment

[PHP]OpenSSLを使った文字列の暗号化と復号

Share on Facebook
Bookmark this on Delicious
LINEで送る
Pocket

PHP には mcrypt という暗号化に関する拡張モジュールがあるのですが長年放置されてしまっているため現在は OpenSSL を使った暗号化が一般的です。
基本的にはパスワードと初期化ベクトル(Initialization Vector)を用いて暗号化と複合を行います。暗号化に利用できる方式はサーバーによって異なるため、事前に openssl_get_cipher_methods() を使って利用可能な暗号化方式を確認しておきます。

<?php
// 暗号化するデータ
$data = 'Hello, World!';

// パスワード
$password = 'password1234';

// 利用可能な暗号化方式一覧
//$methods = openssl_get_cipher_methods();

// 暗号化方式
$method = 'aes-128-cbc';

// 方式に応じたIV(初期化ベクトル)に必要な長さを取得
$ivLength = openssl_cipher_iv_length($method);

// IV を自動生成
$iv = openssl_random_pseudo_bytes($ivLength);

// OPENSSL_RAW_DATA と OPENSSL_ZERO_PADDING を指定可
$options = 0;

// 暗号化
$encrypted = openssl_encrypt($data, $method, $password, $options, $iv);
var_dump($encrypted);

// 復号
$decrypted = openssl_decrypt($encrypted, $method, $password, $options, $iv);
var_dump($decrypted);

結果は base64_encode() された状態で返ります。元のバイナリデータが必要な場合 $options に OPENSSL_RAW_DATA を指定して下さい。

ログイン用パスワードをデータベースに保管する場合など、復号の必要が無い場合は password_hash() の方を利用するのが安全です。

【参考】 OpenSSL関数(http://php.net/manual/ja/ref.openssl.php)

Posted in PHP | Tagged , | Leave a comment