关于方法调用
我将对您的陈述进行一个更正,更准确地暗示面向对象的全部含义。您的评论内容如下:
在“时间类”中运行“GetTime”函数
这只是有点准确,对其进行阐述可能会为您阐明 OOP。为了这篇文章的目的,我可能会这样改写它:
运行绑定到 $time 中存储的对象的“GetTime”方法(在 Time 类中定义)
看到不同?你不仅仅是从一个类中调用一个函数,你说的是“从类中获取处理指令,但是将这些指令绑定到这个特定的对象,然后执行。
这听起来像是切碎的话,但它对于理解封装至关重要。类的对象共享它们的方法定义,但它们不共享数据。
您可以将对象视为本质上由两个事物组成的集合:
- 一块存储它自己的个人数据的内存
- 指向一组对该数据具有特殊访问权限的方法的指针
(方法与数据关系的“特殊”性质是隐式或显式的,由您决定)
当您开始使用“成员变量”(有时称为“对象属性”、“实例变量(aka ivars)”或类似名称)时,这种区别很明显。考虑这个示例代码:
class Person {
public $name;
public printName() {
echo $this->name;
}
}
$me = new Person();
$you = new Person();
$me->name = "Chris";
$you->name = "Alex";
$me->printName(); // "Chris"
$you->printName(); // "Alex"
这突出了一个事实,即每个对象都有自己的实例变量内存。它们共享这些变量的定义,以及为处理这些变量而编写的代码块。
我对这个答案的总体意图特别感兴趣的是特殊变量$this
:同一方法定义中的同一变量实际上指向不同的对象,具体取决于您在哪个对象上调用该方法。
关于new
现在到上一行,您的评论内容为(关于$time = new Time
):
调用类并将类设置为变量
我的表达方式是:
创建这个类的一个实例,并允许我通过 $time 访问该实例
在继续之前,实例这个词将是一个重要的概念。你不调用一个类,你调用一个方法,并且你不(至少在 PHP 中)将变量的值设置为一个类,你将它们设置为指向类的实例。有时人们可以互换使用实例和对象这两个词,这很好。但是您不应该将它们与单词类互换使用。
让我们获得技术:
当您使用new
运算符时,从技术上讲,您是在告诉 PHP 做两件事:
- 获取一些新鲜的内存,正好足以存储类中定义的所有成员变量
- 在该新对象上调用特殊方法以允许我初始化我的对象
因此,如果您调用new
两次,您会为 2 个对象获取足够的内存,依此类推。PHP 使用您的类定义来确定要为您分配多少内存,并找到要调用的特殊方法。
该特殊方法称为__construct
,并保证在创建对象时调用,该特殊$this
变量指向您闪亮的新内存。这是您如何使用它的示例:
class Foo {
private $createdTime;
public function __construct() {
$this->createdTime = time();
}
}
$myFoo = new Foo;
即使您没有看到它,它也__construct()
被调用并且 的值已$createdTime
被初始化。