ログ日記

作業ログと日記とメモ

PHP5.2では実装済みのinterfaceを多重に実装できないらしい

http://blog.xole.net/article.php?id=589
via: http://d.hatena.ne.jp/shimooka/20070820/1187565051

$ php -v
PHP 5.2.0-8+etch7 (cli) (built: Jul  2 2007 21:46:15)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies

$ cat interface.php
<?php
interface Service {
}

interface SoapService extends Service {
    public function add();
}

class SoapServiceImpl implements SoapService, Service {
    public function add(){
    }
}

$ php interface.php

Fatal error: Class SoapServiceImpl cannot implement previously implemented interface Service 
in /home/nishimura/interface.php on line 9


5.1ならできる。

$ php5.1 -v
PHP 5.1.4-Debian-0.1~sarge1 (cli) (built: Jun  7 2006 23:25:19)  (Debian GNU/Linux)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies

$ cat interface.php
<?php

interface Service{
}

interface SoapService extends Service{
  public function add();
}

class SoapServiceImpl implements SoapService, Service{
  public function add(){
      echo "add\n";
  }
}

$a = new SoapServiceImpl();
$a->add();

$ php5.1 interface.php
add


というかJavaを使ってないからよく分からないんだけど、こういう状況って何故Serviceをimplementsする必要があるのか分からない。


ざっと検索したけどよくわからなかった。

interfaceの多重継承はどのようなところで使うのでしょうか?
セマンティクスとしては、複数の見方ができる一つの概念を新たに
定義したいということだと思いますが、具体的にはどのような使い方が
あるのでしょうか?複数の見方がしたいのであれば、複数のinterfaceを
implementsすればよいと思います。あるいは、最初に述べたinterface
の最初の役割において、よい使い方があるのでしょうか?(確かに
implementsにいくつもinterfaceを書く必要がないので、記述は楽になり
ますけど)

http://java-house.jp/ml/archive/j-h-b/026491.html

ここの最後の一文は

class SoapServiceImpl implements SoapService

と出来るから楽だよね、って言いたいんだよね。意味が違うな。