美文网首页
PHP学习笔记-新模式:上下文管理器

PHP学习笔记-新模式:上下文管理器

作者: 赵客缦胡缨v吴钩霜雪明 | 来源:发表于2020-11-12 09:34 被阅读0次

PHP7之后提供了类似上下文概念,如下代码:

function open($file, $mode = 'r'){
  $f = fopen($file, $mode);
  yield $f;
  fclose($f);
}

此函数用的是生成器,我们可以使用foreach循环,只需循环一次。

foreach(open('output.txt','w') as $file)
{
    fwrite($file,'Hello World!');
}

程序员需要构建自己的上下文管理器,这是确保自己清理的一种更简洁的方法。

下一步举个例子,例如要使用PDO连接。首先连接到数据库,在事务中执行一些工作,然后自动提交结果。

类似如下代码:

try
{
  $dbh = new PDO($dsn, $user, $pass, $options);
} catch (Exception $e) {
  die("Unable to connect: " . $e->getMessage());
}
try {
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $dbh->beginTransaction();
  $dbh->exec("insert into users (id, name, wechat) values (5, 'Eric', 'ericlu')");
  $dbh->exec('insert into authors (id) values (5)');
  $dbh->commit();
} catch (Exception $e) {
  $dbh->rollBack();
  echo "Failed: " . $e->getMessage();
}

换用上下文管理器进行相同的操作,代码则要简单很多:

function transaction()
{
  $dbh = new PDO($dsn, $user, $pass, $options);
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $dbh->beginTransaction();
  yield $dbh;
  try {
    $dbh->commit();
  } catch (Exception $e) {
    $dbh->rollBack();
  }
}
// Now use the transaction
foreach(transaction() as $dbh) {
  $dbh->exec("insert into users (id, name, wechat) values (5, 'Eric', 'ericlu')");
  $dbh->exec('insert into authors (id) values (5)');
}

这比第一个示例要复杂。

要点是数据库连接和事务的安装和卸载都发生在dtransaction()外,这里的函数可以和代码的其余部分位于单独的文件或命名空间中,从而使代码执行逻辑保持简洁,不必担心安装/卸载。

另外,在以上例子中使用Iterator接口的ContextManager对象加一个析构函数,对异常处理会更加强壮。

文件、数据库与资源的远程连接,锁,线程这些都是密集型的操作,使用上下文模式则会让代码更简洁,运行更流畅。

在Python和很多语言都利用了此模式。

这是一种让你的PHP代码更有作为的一种模式。诚然,它与以前的编写PHP的方式有些不同,也更加让人耳目一新。

相关文章

  • PHP学习笔记-新模式:上下文管理器

    PHP7之后提供了类似上下文概念,如下代码: 此函数用的是生成器,我们可以使用foreach循环,只需循环一次。 ...

  • Python上下文管理器

    上下文管理器 概念:实现了上下文协议的对象即为上下文管理器。 上下文管理器的协议: __enter__进入的方法_...

  • python上下文管理器细读

    test 1 上下文管理器,将生成器转化为上下文管理器 test 2 使用上下文管理器,抽象出异常处理 test ...

  • python中上下文管理器

    什么是上下文管理器? 代码的环境就是上下文,实现了上下文管理器协议的类产生的实例就是上下文管理器对象。在类中声名e...

  • Python的上下文管理器

    什么是上下文管理器 上下文管理器是一个对象,它定义了在执行 with 语句时要建立的运行时上下文。 上下文管理器处...

  • Python学习打call第三十一天:上下文管理器

    1.什么是上下文管理 上下文管理器是一个包装任意代码块的对象,上下文管理器保证进入上下文管理器时,每次代码执行的一...

  • python 上下文管理器

    一、什么是上下文管理器? 上下文管理器类型是python的内置类型之一,上下文管理器的定义:允许用户自定义类来定义...

  • python的上下文管理器

    上下文管理器的概念 上下文管理器的任务是代码块执行前准备,代码块执行后收拾。 如何使用上下文管理器? 如何使用上下...

  • Python上下文管理器

    1.与装饰器的区别 上下文管理器是装饰器的近亲,装饰器用于包装函数,上下文管理器用于包装任意代码块. 上下文管理器...

  • 算法面试 - 问题记录

    python上下文管理器,装饰器? (1)上下文管理器知乎链接:https://zhuanlan.zhihu.co...

网友评论

      本文标题:PHP学习笔记-新模式:上下文管理器

      本文链接:https://www.haomeiwen.com/subject/wipubktx.html