小编pla*_*one的帖子

为什么单身人士在PHP环境中如此糟糕?

可能重复:
谁需要单身人士?

我想知道,在php脚本中使用Singletons有什么缺点.我使用它们很多,我有时无法理解对开发人员的批评.一些例子:

我有一个Request类:

消除POST,GET,COOKIE inputdata并使用它而不是全局数组 - 严格地和全局地.喜欢

$request = Request::getInstance();
$firstname = $request->post('firstname', $additionalFilters);
Run Code Online (Sandbox Code Playgroud)

每个请求始终只有一个请求.为什么在这种情况下使用单例是一个坏主意?

$ _SESSION也是如此:

我有一个Session类(Singleton),它代表$ _SESSION数组,因为只有一个会话,我全局使用它.

数据库

$mysql  = DB::getInstance('mysql', 'dbname'); //pseudo
$sqlite = DB::getInstance('sqlite', 'dbname'); //pseudo
Run Code Online (Sandbox Code Playgroud)

对于每种类型的数据库,我只想要一个对象,而不是更多.在我看来,否则存在混乱的风险.

独特的行

此外,我经常使用类来表示/使用db表的唯一行.

$article = Article::getInstance($id);
$navigation = Navigation::getInstance($id);
Run Code Online (Sandbox Code Playgroud)

我认为这样做只会带来好处.我从不想要第二个对象代表一个独特的行.为什么单身人士这么糟糕呢?

事实上,大多数(几乎所有)我的类没有公共构造函数,但总是像getInstance($ id)或create()这样的静态方法,所以类本身处理可能的实例(这并不意味着它们都是单例根据定义)

所以我的问题是:有没有我还没有意识到的缺点.具体情况是单身怀疑者在对Singletons提出建议时的想法.

编辑:

现在,你有一个包装$ _POST的单例,但是如果你没有$ _POST,但又想用一个文件来输入呢?在这种情况下,如果您有一个抽象的输入类,并实例化一个POSTInput来通过发布的数据来管理输入,那将会更方便.

好的,有效的优点.我没有意识到这一点.特别是关于Request类的观点.

我仍怀疑这种方法.假设我有一个"功能"类,它执行一个具体的请求(如留言簿组件).在该类中,我想获得一个发送参数.所以我得到了我的单身Request实例

$req = Request::getInstance(); 
$message = $req->post('message');
Run Code Online (Sandbox Code Playgroud)

这样,只有我的功能对象关心Request类.

当我使用非单例方法时,我需要一个额外的类/函数来管理每个请求获得一个有效的请求对象.这样我的功能类不需要知道那个管理类,但在我看来仍然会出现依赖/问题:每次我创建一个功能对象的实例时,我有可能忘记设置一个请求对象.

当然,我可以在创建功能时定义非可选参数.但这在某个时候会导致参数过度杀伤.或不?

php singleton design-patterns

6
推荐指数
1
解决办法
2758
查看次数

Host PHP 与 Docker PHP:慢 5 倍

我们使用 docker 进行 PHP 开发,我很好奇在我的主机上运行 PHP 7.4 与在 docker 容器中运行代码时的性能差异。

我正在运行最新Linux Mint版本,而 docker 版本是Docker version 20.10.17- 没有特殊的非标准配置。

为了对两个 PHP 环境进行公平的比较,我仔细检查了配置,当然还禁用了 xdebug。

然后我运行一些基本的 php 基准测试,这是我在 github 上找到的:

<?php

$startTime = time();
$runSeconds = 5;
$rounds = 5;
$count = 0;
for ($i=0; $i<$rounds; $i++) {
    while ((time()-$startTime) <= $runSeconds) {
        serialize(['bar'=>'foo']);
        $count ++;
    }
    $round = $i+1;
    $startTime += $runSeconds;
    $count = number_format($count);
    echo "Round {$round}: {$count} /per {$runSeconds} second\n";
    $count = 0;
}
Run Code Online (Sandbox Code Playgroud)

我的主机 PHP 7.4 …

php linux performance docker

4
推荐指数
1
解决办法
1040
查看次数

标签 统计

php ×2

design-patterns ×1

docker ×1

linux ×1

performance ×1

singleton ×1