我非常精通PHP,不在OOP之外 - 我现在才开始跳槽。
我一直在看视频和阅读教程,但它们仍然令人困惑......
如果我有
文件1(class.time.php)
class Time {
function GetTime(){
$time = date('H:i:s');
printf($time);
}
}
然后在另一个php页面中我有
文件2(page.php)
我能做到
include('class.time.php');
然后在本页的任何地方我都可以
$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'
我的主要问题是,上面的评论(这是基本上说.....)正确吗?还是有更好的方法来思考它?
答案 0 :(得分:6)
我会对你的陈述进行一次修改,更准确地暗示对象定位是什么。您的评论如下:
在'时间类'中运行'GetTime'功能
这只是有点准确,并阐述它可能会为您澄清OOP。出于本文的目的,我可能会这样改写:
运行'GetTime'方法(在Time类中定义)绑定到$ 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"
这突出了这样一个事实,即每个对象都有自己的内存作为实例变量。它们共享这些变量的定义,以及为处理这些变量而编写的代码块。
特殊变量$this
对我的总体意图特别感兴趣:这个方法定义中的相同变量实际上指向不同的对象,具体取决于您调用方法的对象。
new
现在到上一行,您的评论读取(关于$time = new Time
):
调用类并将类设置为变量
我说的方式是:
创建此类的实例,并允许我通过$ time
访问该实例
这个词,实例将是一个很大的概念,在继续之前变得坚实。你没有调用一个类,你调用一个方法,你没有(至少在PHP中)将变量的值设置为一个类,你设置它们指向类的实例。有时人们可以互换地使用 instance 和 object 这两个词,这很好。但是你不应该将它们与 class 这两个词互换使用。
让技术:
当您使用new
运算符时,从技术上讲,您告诉PHP要做两件事:
因此,如果您两次调用new
,则会为2个对象获取足够的内存,依此类推。 PHP使用您的类定义来确定要为您分配多少内存,并找到要调用的特殊方法。
该特殊方法称为__construct
,并且保证在创建对象时调用该方法,并使用指向闪亮新内存的特殊$this
变量。以下是您可以如何使用它的示例:
class Foo {
private $createdTime;
public function __construct() {
$this->createdTime = time();
}
}
$myFoo = new Foo;
即使您没有看到,__construct()
被调用,$createdTime
的值也已初始化。
答案 1 :(得分:0)
这是正确的,但语法应为:
$time = new Time();
$time->GetTime();
(不要忘记括号,否则你指的是类属性)
此外,最好将您的方法声明为public,protected或private。如果您要从课外调用GetTime方法,则需要公开。
答案 2 :(得分:0)
是的,基本上你的假设是正确的(除了语法错误)。
然而,这不是一个非常好的OO设计。
看看这个,它提供了一些OO设计的好例子:http://www.math-cs.gordon.edu/courses/cs211/ATMExample/
答案 3 :(得分:0)
因为在这种情况下“get time”永远不会改变并且不接受任何参数,所以你最好把它放到静态方法中,因为在这种情况下实例化一个类是浪费
例如:
class Time {
static public function GetTime(){
$time = date('H:i:s');
printf($time);
}
}
Time::GetTime(); // gets the time, no need to do $time = new Time();
答案 4 :(得分:0)
在我看来,你做得对,但是对于使用一个简单的内置日期函数,通过类使用它可能会使它复杂化。
以下是在PHP中学习OOP的优秀文章 PHP OOP for beginners