为什么PHP同时具有“资源”数据类型和“对象”数据类型?

ubbxdtey  于 2023-02-18  发布在  PHP
关注(0)|答案(1)|浏览(136)

PHP似乎有两种对象数据类型:“资源”和“对象”。
例如,以下对象是“资源”:

$file = fopen("1.txt", "w");

// will print: "resource"
echo gettype($file);

而下面的对象是一个“对象”:

$db = mysqli_connect();

// will print: "object"
echo gettype($db);

但是为什么对象有两种数据类型而不是一种呢?

xdnvmnnf

xdnvmnnf1#

资源不是对象!它们是不同的数据类型。
这纯粹是历史原因。PHP在开始时没有任何面向对象的功能。这种语言并不意味着是一种新语言,而是一种C API的模板引擎。C没有类。
PHP需要一种方法来表示指向内部资源的指针,例如打开的文件、数据库连接或图像画布。PHP可以只使用整数来完成这一任务,但这还不够。内部资源必须由PHP引用计数和记忆。PHP不像C,有垃圾收集和抽象内存处理 *。你不能只用一个ID号。PHP必须返回一个内部指向资源的变量,最简单的方法是使用一个特殊的resource数据类型,现在使用对象来实现,例如CurlHandle
资源是一个糟糕的想法。它们不能很好地与类型系统的其他部分配合。它们是一个例外,让许多PHP用户感到困惑。从PHP 7开始,目标就是将所有资源迁移到不透明对象并删除资源数据类型。虽然它还没有消失,但它可以被视为一个遗产和PHP历史的一部分。
有关resource数据类型及其内部工作方式的详细信息,请访问www.phpinternalsbook.com

  • 虽然大多数资源都有一个专门的函数来释放它们,但这是不必要的,因为PHP会关闭句柄,并在没有更多变量指向它时释放内存。资源数据类型跟踪句柄的使用位置以及是否仍然需要它。

相关问题