我非常精通PHP,在OOP之外 - 我现在才开始跳槽.
我一直在看视频和阅读教程,但它们仍然令人困惑......
如果我有
文件1(class.time.php)
class Time {
function GetTime(){
$time = date('H:i:s');
printf($time);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在另一个php页面中我有了
文件2(page.php)
我可以
include('class.time.php');
Run Code Online (Sandbox Code Playgroud)
然后我可以在这个页面的任何地方做
$time = new Time; //Calling the class and setting the class to a variable
$time->GetTime(); //This is BASICALLY saying (run the 'GetTime' function in the 'Time Class'
Run Code Online (Sandbox Code Playgroud)
我的主要问题是,上面的评论(这是基本上说.....)正确吗?还是有更好的方法来思考它?
我会对你的陈述进行一次修正,更准确地暗示对象定位是什么.你的评论是:
在'时间类'中运行'GetTime'功能
这只是有点准确,并阐述它可能会为您澄清OOP.出于本文的目的,我可能会这样改写:
运行绑定到$ time中存储的对象的'GetTime'方法(在Time类中定义)
看到不同?您不只是从类中调用函数,而是说"从类中获取处理指令,但将这些指令绑定到此特定对象然后执行.
这可能听起来像是剁碎的话,但它对理解封装至关重要.类的对象共享其方法定义,但它们不共享数据.
您可以将对象视为一组两件事:
(方法与数据的关系的"特殊"性质是隐式的还是显式的,取决于你)
当您开始使用"成员变量"(有时称为"对象属性","实例变量(又名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"
Run Code Online (Sandbox Code Playgroud)
这突出了这样一个事实,即每个对象都有自己的内存作为实例变量.它们共享这些变量的定义,以及为处理这些变量而编写的代码块.
特殊变量$this对我的总体意图特别感兴趣:这个方法定义中的相同变量实际上指向不同的对象,具体取决于您调用方法的对象.
new现在到上一行,您的评论读取(关于$time = new Time):
调用类并将类设置为变量
我会这样说的方式是:
创建这个类的实例,并允许我通过$ time访问实例
这个词,实例将是一个很大的概念,以便在继续之前获得稳固.你不调用一个类,你调用一个方法,而你(至少在PHP中)没有将变量的值设置为一个类,你将它们设置为指向类的实例.有时人们可以互换地使用单词实例和对象,这很好.但是你不应该将它们与单词class互换使用.
我们得到技术:
当您使用new运算符时,从技术上讲,您告诉PHP要做两件事:
因此,如果您调用new两次,则为2个对象获取足够的内存,依此类推.PHP使用您的类定义来确定要为您分配多少内存,并找到要调用的特殊方法.
调用该特殊方法__construct,并保证在创建对象时调用该方法,该特殊$this变量指向闪亮的新内存.以下是如何使用它的示例:
class Foo {
private $createdTime;
public function __construct() {
$this->createdTime = time();
}
}
$myFoo = new Foo;
Run Code Online (Sandbox Code Playgroud)
即使您没有看到它,也会__construct() 被调用,并且值$createdTime已初始化.