PHP,OOP,创建一个对象

时间:2012-06-04 08:31:31

标签: php oop

我正在学习PHP,OOP并且我学到了很多东西,但有些东西可以取笑我,

我创建了一个用于说明对象创建的图像:Link

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

  • 如果我对图像做错了,有人可以纠正我,我会很高兴。
  • 当我尝试回显一个对象时,我收到一条错误,指出该对象 (我明白Object是内存引用)无法转换为字符串,如果它不是内存位置名称的字符串(例如:'F70'),我可以举例说明内存位置是什么样的。< / LI>
  • 关于包含引用的变量,我理解这是一个与所有其余全局变量一起放置的常规变量,我的意思是如果我创建新对象和一个新变量,第一个对象(变量)包含引用但它是一个常规的全局变量,同样是另一个变量:

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

第二步:创建对象并将内存位置放入我们想要的变量中......

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

当我调用一个Object(变量)时,是什么意思:

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

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

<?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()

答案 1 :(得分:1)

  1. 要获得对象的字符串表示,您必须实现函数__toString()

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

答案 2 :(得分: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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

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

因此,当您使用new运算符创建对象时,此“表”将在内存中创建并填充值。该表有其基地址。这是分配给对象变量。

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

这非常简化。但我认为它应该可以帮助你成像,计算机实际上在后台做了什么。