0

重複の可能性:
PHP OOP:引数タイプごとに一意のメソッド?
PHP 5.3メソッドのオーバーロード(Javaのように)

ユーザーやグループのようないくつかの異なるクラスがあります。クラスの属性を追加するための一般的なクラスを作成したいと思います。私のクラスには、追加、削除、編集などの機能があります。例:

<?php
class Persistence{
    function add(Users $userObj){
        ....
    }
    function add(Groups $groupObj){
        ....
    }
}
?>

これどうやってするの?

4

5 に答える 5

5

PHPでは型ヒントが許可されていますが、引数型に基づくメソッドのオーバーロードは許可されていません。したがって、ケースごとに異なるメソッドを作成し、代わりにこれらを使用する必要があります。ただし、できることは、add-methodからタイプヒントを削除し、代わりにif-elseステートメントまたは引数のスイッチを使用することです。

public function add ($collection) }
   if($collection instanceof Users) {
     return $this->addUsers($collection);
   }
   if($collection instanceof Groups) {
     return $this->addGroups($collection);
   }
   ...
   throw new InvalidArgumentException("Unknown collection type");
}

public function addUsers(Users $users) {
}

public function addGroups(Groups $groups) {
}
于 2012-10-22T05:24:51.960 に答える
2

Persistence別の解決策は、クラスのインターフェースを作成することです。

interface PersistenceInterface { /* ... */ }

class Users implements PersistenceInterface { /* ... */ }
class Groups implements PersistenceInterface { /* ... */ }

class Persistence
{
    public function add(PersistenceInterface $userObj)
    {
        // ...
    }
}

このように、インターフェースでマークされたオブジェクトのみがPersistenceクラスで許可されます。

于 2012-10-22T05:24:41.380 に答える
2

このようなメソッドのオーバーロードは不可能です。宣言の述語を弱める必要があります。

function add($obj)
{
    if ($obj instanceof Users) {
    } elseif ($obj instanceof Groups) {
    } else {
        throw new Exception("Invalid type for object");
    }
}
于 2012-10-22T05:17:04.737 に答える
0

PHPでは、オーバーロードはプロパティに対してのみ行われ、他の言語から慣れている場合とは異なります。__call__callStaticをオーバーロードすることもできますが、継承を使用する方が簡単です。

于 2012-10-22T05:19:46.390 に答える
0

PHPには型付きパラメーターがないため、例のようにそれを行うことはできません。ただし、タイプを指定して2番目のパラメーターを渡し、それを関数内で使用することもできます。

function add($type, $object){
    if ($type=="user"){
       // process $object as a user
    } elseif ($type=="group"){
       // process $object as a group
    }
}
于 2012-10-22T05:20:05.830 に答える