【问题标题】:PHP, OOP, Creating an object [closed]PHP,OOP,创建对象 [关闭]
【发布时间】:2012-06-08 08:31:24
【问题描述】:

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

我创建了一张图片用于说明对象创建:Link

如果有人可以回答一些问题,请...

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

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

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

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

当我调用一个对象(变量)是什么意思:

第一步:我们要去创建变量的内存位置...

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

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

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

【问题讨论】:

  • 由于 PHP 不会以任何方式公开或提供对内存位置的访问,您不担心错误的细节吗?
  • 我为什么要,我正在学习这不是原子弹试验。
  • 这个问题似乎与 c 、 c++ 或 java 相关。
  • 是的,它看起来确实是一样的,尽管 PHP 中的数组是值类型,而 Java 中的数组是引用类型 :-)

标签: php oop


【解决方案1】:
  1. 要获得对象的字符串表示,您必须实现函数__toString()

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

【讨论】:

  • 谢谢你,Vitaly,我会阅读你的链接,但我能看看参考资料的样子吗?
  • 通过第 2 页的链接并阅读有关 zval 的信息
  • 我会感谢 Vitaly 并祝您有美好的一天。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢Joeri,我会阅读链接的。
【解决方案3】:

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

【讨论】:

  • 谢谢 Jan,我会阅读它并回显我的对象,我的意思是这样我就可以知道它包含的引用是什么样子的。
【解决方案4】:

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

【讨论】:

  • 谢谢 moeso,你说 $ob 不是引用,你说它是我的类的实例,所以这里的对象在哪里,如果我们有类的实例并且我们使用我们的类方法和变量,所以对象在哪里进入,我知道我在某些方面错了,但你能解释一下 $ob 包含的内容吗,再次感谢,祝你有美好的一天。
【解决方案5】:

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

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

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

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

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

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

【讨论】:

  • 谢谢您的回答 B.Gen。祝你有美好的一天。
猜你喜欢
  • 2017-11-29
  • 2018-10-19
  • 1970-01-01
  • 2015-05-04
  • 2013-01-14
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多