如何用PHP中更灵活的代码替换switch语句?

Vit*_*lyP 0 php oop design-patterns

我的数据库中有一个名为posts的表.每个帖子都有一个名为social_network的字段

当我在代码中将所有帖子都放入数组时,我需要根据它的social_network字段为每个帖子创建实例.

现在我使用switch语句,但我不喜欢它,因为它不灵活.

$posts = DataBase::getPosts(); // pseudocode
foreach($posts as $post) {
  switch($post->getSocialNetwork()){
    case 'Facebook':
      $social = new FacebookPost($post->getId());
      break;
    case 'Twitter':
      $social = new TwitterPost($post->getId());
      break;        
    // .... other social networks
  }
}
Run Code Online (Sandbox Code Playgroud)

ddi*_*hev 7

添加一个接口到FacebookPost和TwitterPost类(例如SocialPostInterface),它已经定义了相同的基本必要方法getId(),postToNetwork()然后您可以添加任意数量的新社交网络,而无需更改这段代码.他们只需实现界面

然后体验多态性的力量:

foreach ($posts as $post) {
    $className = $post->getSocialNetwork() . 'Post';
    // lets check if such class exists
    if (!class_exists($className, false /* do not attempt autoload */)) {
        throw new Exception("Unknown social network post class $className");
    }
    $social = new $className($post->getId());
    $social->doSomeStuffThatTheInterfaceHasDeclared();
}
Run Code Online (Sandbox Code Playgroud)