忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/05/27 13:13 |
PHP5.5.3 PHPでスカラー型の強い型付け
<?php
	$object = new stdClass();
	$object = '1' + 1;
	
	$boolean = ( '1' == 1 );
$objectはint型の2、$booleanはtrueになり、Java出身者が憤死します。
PHPの型の挙動には色々と論がある人も多いですが、PHPの特徴だと思って諦めましょう。
まあ私はこういうの嫌いではないですが、推移律が成り立たないのはさすがにどうかと思う。

しかし時には、どうしても厳密に型を適用したいんだよ、という場合があるかもしれません。
そんなときのためにSplTypeです。

今のところデフォルトでは入ってないのでPECLから持ってきましょう。
Windows版のDLLも存在します。
<?php
	$int = new SplInt(1);
	
	$int = 2; // 2
	$int++; // 3
	
	$int = 1.0; // Fatal error: Uncaught exception 'UnexpectedValueException'
	$int = 'a'; // Fatal error: Uncaught exception 'UnexpectedValueException'
	
	$a = $int + 10; // 13
	for($i=1; $i<$int; $i++){} // 問題なく動作
PHPがあたかもRubyのような強い型付けに!

$intは、intもしくはSplInt以外を代入しようとするとUnexpectedValueExceptionを発生します。
これで$intの型一意性が保証されることになりました。
逆に$intを演算に使う場合は、ただの整数と同じように扱えます。

型付けの対象としては、int以外にfloat、boolean、stringの各スカラー型、そしてEnum型が用意されています。

ところで、

http://www.php.net/manual/ja/intro.spl-types.php
> スカラー型のタイプヒンティングの代替手段として使用できます。

って書いてあるのですが、あくまで代替のようで完全なタイプヒンティングとしては使えませんでした。
<?php

	class HOGE{
		
		private $int;
		
		// setSplIntは呼び出し側でキャストしないといけない
		public function setSplInt(SplInt $int){
			$this->int = $int;
		}
		
		// setIntは概ね想定した動作だがタイプヒンティングではない
		public function setInt($int){
			$this->int = new SplInt($int);
		}
	}

	$hoge = new HOGE();

	$hoge->setSplInt(new SplInt(1));
	$hoge->setSplInt(1); // Argument 1 must be an instance of SplInt, integer given
	$hoge->setInt(2);
	$hoge->setInt(2.0); // Uncaught exception 'UnexpectedValueException'
まあ後者で作っておけば実質的には困らないと思います。
PR


2014/01/10 23:08 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<買ったものリスト 2014/01/12 | HOME | Dust: An Elysian Tail Chapter12>>
忍者ブログ[PR]