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