[英]Using Classes / OOP in PHP
我对OOP以外的PHP十分精通-我刚刚开始接触。
我一直在观看视频和阅读教程,但它们仍然令人困惑……
如果我有
文件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'
我的主要问题是,上面的评论(基本上是说.....)正确吗? 还是有更好的方法来考虑它?
我将对您的陈述进行一次更正,以更准确地暗示“对象定向”的含义。 您的评论为:
在“时间类别”中运行“ 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"
这凸显了一个事实,每个对象都有自己的实例变量内存。 它们共享这些变量的定义,以及为处理这些变量而编写的代码块。
对于这个答案,特殊变量$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;
即使你没有看到它, __construct()
被调用和价值$createdTime
被初始化。
没错,但是语法应为:
$time = new Time();
$time->GetTime();
(不要忘记括号,否则您将引用类属性)
同样,将您的方法声明为public,protected或private是一个好主意。 如果要从类外部调用GetTime方法,则该方法必须是公共的。
是的,基本上您的假设是正确的(除了语法错误)。
但是,那并不是一个很好的面向对象设计。
看看这个,它提供了一些OO设计的好例子: http : //www.math-cs.gordon.edu/courses/cs211/ATMExample/
由于在这种情况下,“获取时间”将永远不会改变并且不接受任何参数,因此您最好将其放入静态方法中,因为在这种情况下实例化类是浪费的
例如:
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();
我认为您的做法是正确的,但是对于使用简单的内置日期函数而言,通过类使用它可能会使它过于复杂。
以下是在PHP中学习OOP的优秀文章PHP初学者
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.