0

我正在学习PHP,OOP,我学到了很多东西,但是有一些小事逗我,

我创建了一个图像来说明对象创建:链接

如果有人可以回答几个问题,请...

  • 如果我对图像做错了什么,如果有人能纠正我,我会很高兴。
  • 当我尝试显一个对象时,我收到一个错误,指出该对象(我知道该对象是内存引用)不能转换为字符串,如果它不是内存位置名称的字符串(例如:'F70' )我可以举个例子来说明内存位置的样子。
  • 关于包含引用的变量,我知道这是与所有其余全局变量一起放置的常规变量,我的意思是,如果我创建新对象和新变量,则第一个对象(变量)包含引用,但它是一个常规的全局变量,其他变量也是如此:

第一步:我定义对象变量...

第二步:创建的对象及其内存位置进入我们想要的变量中......

第三步:使用我们的引用创建新的全局变量。

当我调用对象(变量)时,这意味着什么:

第一步:我们将转到创建变量的内存位置...

第二步:变量值(引用)将我们指向对象所在的内存位置......

第三步:我们可以访问该对象的方法和属性。

如果有人能帮助我理解这些事情,我会很高兴,谢谢大家,祝你有美好的一天。

4

5 回答 5

3

PHP 不返回内存引用,而是返回您的类的实例。通常,您不知道对象是在内存中的哪个位置创建和存储的。如果您仍然需要在 PHP 中使用内存位置和引用,那么 Stack Overflow 上已经有一个很好的答案:How check memory location of variable in php? . 关于 PHP 中 OOP 的使用,您应该查看 php.net 上的类和对象手册。

关于回显对象:如果要回显对象,则需要定义一个__toString() 魔术方法,该方法指定对象应如何表示为字符串。在你的情况下,这将是

<?php
class x {
    public function num() {
         return 5;
    }
    public function __toString() {
         return $this->num();
    }

}
$ob = new x();
echo $ob; // outputs 5

在 PHP 中,$ob不是对内存位置的引用,而是类的实例。所以你也可以echo $ob->num();在不定义__toString()方法的情况下调用。

于 2012-06-04T08:54:00.493 回答
1

我不是 PHP 程序员,但也许我可以帮助你至少一点,以减少你的困惑。

同样,我不确定 php(因为它是解释型语言)实际上是如何处理对象创建的,但它应该非常接近 C++ 的处理方式。归根结底,在同一个硬件上运行。

因此,您知道您的类是编译器(解释器)的“模板”。但是您需要了解对象实际上是什么。对象实际上就像一张信息表。它包含你的类的变量。它不包含方法。

因此,当您使用new运算符创建对象时,此“表”会在内存中创建并填充值。这个表有它的基地址。那被分配给对象变量。

这里重要的是,对象不包含实际方法。这些是在内存的其他地方创建的。当您调用某个对象方法时,您实际上调用了“常规”函数,并且编译器将对象的(该表的)地址作为其参数之一传递给它。

这是非常简化的。但我认为它应该可以帮助您了解计算机在后台实际执行的操作。

于 2012-06-04T08:57:57.273 回答
1
  1. 要获得对象的字符串表示,您必须实现函数__toString()

  2. 关于内部机制——它比你想象的要复杂得多。由于 PHP 是一种动态语言 - 它必须为每个类、每个类对象保留大量信息。不仅字符串变量需要内存,还需要函数映射、内存管理结构、类型结构、默认值。如果您想更深入,请阅读此内容

于 2012-06-04T08:42:26.463 回答
1

所有 PHP 变量都存储为“zval”。

有关 zval 的更多信息:http: //docstore.mik.ua/orelly/webprog/php/ch14_06.htm

转储 zval 内部信息的函数:http: //php.net/manual/en/function.debug-zval-dump.php

于 2012-06-04T08:43:12.927 回答
1

当您尝试回显您的对象时,您必须在您的类中覆盖 __toString() 魔术函数。我真的建议你阅读这篇文章http://net.tutsplus.com/tutorials/php/object-oriented-php-for-beginners/。它几乎回答了你的问题。

于 2012-06-04T08:44:35.807 回答