【概要】
この記事では A Tour of Go のExercise: Stringers の解答例をgolangおよびPHPで提示します。phperの方はこの解答例を参考にしてGopherちゃんと触れ合っていただけると幸いです。
今回取り扱うExerciseの内容は下記の通りです
IPAddr 型を実装してみましょう IPアドレスをドットで4つに区切った( dotted quad )表現で出力するため、 fmt.Stringer インタフェースを実装してください。
例えば、 IPAddr{1, 2, 3, 4} は、 “1.2.3.4” として出力するようにします。
※なお先に宣言させていただきますがPHPでは問題とはかなり異なる仕上がりとなっております
【golangでの解答例】
– コード
package main
import "fmt"
type IPAddr [4]byte
// TODO: Add a "String() string" method to IPAddr.
func (ip IPAddr) String() string {
return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3])
}
func main() {
hosts := map[string]IPAddr{
"loopback": {127, 0, 0, 1},
"googleDNS": {8, 8, 8, 8},
}
for name, ip := range hosts {
fmt.Printf("%v: %v\n", name, ip)
}
}
– 実行結果
loopback: 127.0.0.1
googleDNS: 8.8.8.8
【PHPでの解答例】
– コード
<?php
interface Convertable
{
public function get();
}
class IPAddr implements Convertable
{
private $ip1;
private $ip2;
private $ip3;
private $ip4;
public function __construct($ip1, $ip2, $ip3, $ip4)
{
$this->ip1 = $ip1;
$this->ip2 = $ip2;
$this->ip3 = $ip3;
$this->ip4 = $ip4;
}
public function get()
{
return $this->ip1 . "." . $this->ip2 . "." . $this->ip3 . "." . $this->ip4;
}
}
class Printer
{
public function __construct()
{
}
public static function create()
{
return new self();
}
public function print($elem)
{
if ($elem instanceof Convertable) {
echo $elem->get();
} elseif (gettype($elem) === "object") {
throw new Exception("invalid argument");
} else {
echo $elem;
}
}
}
$hosts = array(
"loopback" => new IPAddr(127, 0, 0, 1),
"googleDNS" => new IPAddr(8, 8, 8, 8)
);
foreach ($hosts as $name => $ip) {
Printer::create()->print($name);
Printer::create()->print(": ");
Printer::create()->print($ip);
Printer::create()->print("\n");
}
– 実行結果
loopback: 127.0.0.1
googleDNS: 8.8.8.8
【golangとPHPを比較して】
golangとPHPとではインターフェースの定義が異なるため混同してしまうと訳が分からなくなってしまいます。
参考までにA Tour of Goではgolangのインターフェースについて下記のように記述されています。
interface(インタフェース)型は、メソッドのシグニチャの集まりで定義します。
そのメソッドの集まりを実装した値を、interface型の変数へ持たせることができます。
StringのインターフェースをPHPでは定義できない以上このような実装になるしかないのかと思います。もしPHPで綺麗な実装ができるのであればコメントで指摘していただけると幸いです。