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

如何在PHP中用更灵活的代码替换switch语句?,php,oop,design-patterns,Php,Oop,Design Patterns,我的数据库中有一个名为posts的表。每个帖子都有一个名为social_network的字段 当我在代码中将所有帖子放到数组中时,我需要根据每个帖子的社交网络字段为其创建实例 现在我使用switch语句,但我不喜欢它,因为它不灵活 $posts=数据库::getPosts;//伪码 foreach$posts作为$post{ 切换$post->getSocialNetwork{ “Facebook”案例: $social=newfacebookpost$post->getId; 打破 “推特”案

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

当我在代码中将所有帖子放到数组中时,我需要根据每个帖子的社交网络字段为其创建实例

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

$posts=数据库::getPosts;//伪码 foreach$posts作为$post{ 切换$post->getSocialNetwork{ “Facebook”案例: $social=newfacebookpost$post->getId; 打破 “推特”案例: $social=newtwitterpost$post->getId; 打破 //……其他社交网络 } }
在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();
}

您可以从保存其名称的字符串创建新对象。

我认为您无法避免这种代码。但是,您可能希望将其移动到抽象工厂中,这样就不必在控制器中查看它

$posts = DataBase::getPosts(); // pseudocode
foreach($posts as $post) {
    $social = SocialFactory::post($post);
  }
}

在你所做的事情中它是如何不灵活的?根据他的代码,他已经在使用多态性。。。另外,PHP使用duck类型,没有强制使用公共祖先或接口,尽管将其用作文档是一个好主意。我将在PostFactory类中使用此代码。DampeS8N我的第一句话是对Karoly Horvath的,很抱歉理解错误。@Veseliq:亲爱的幽默herold,我刚刚思考了你的句子,然后体验了多元精神的力量。还要注意的是,对我们来说显而易见的东西对初学者来说可能是一个重要的洞察;如果isset$interfaces['Some\\Namespace\\MyInterface']{抛出新异常类$className未实现正确的接口;}这只是普通的工厂方法-
$posts = DataBase::getPosts(); // pseudocode
foreach($posts as $post) {
    $social = SocialFactory::post($post);
  }
}