-1

在 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'

我的主要问题是,上面的评论(这基本上是说.....)是否正确?还是有更好的思考方式?

4

5 回答 5

6

关于方法调用

我将对您的陈述进行一个更正,更准确地暗示面向对象的全部含义。您的评论内容如下:

在“时间类”中运行“GetTime”函数

这只是有点准确,对其进行阐述可能会为您阐明 OOP。为了这篇文章的目的,我可能会这样改写它:

运行绑定到 $time 中存储的对象的“GetTime”方法(在 Time 类中定义)

看到不同?你不仅仅是从一个类中调用一个函数,你说的是“从类中获取处理指令,但是将这些指令绑定到这个特定的对象,然后执行。

这听起来像是切碎的话,但它对于理解封装至关重要。类的对象共享它们的方法定义,但它们不共享数据

您可以将对象视为本质上由两个事物组成的集合:

  1. 一块存储它自己的个人数据的内存
  2. 指向一组对该数据具有特殊访问权限的方法的指针

(方法与数据关系的“特殊”性质是隐式或显式的,由您决定)

当您开始使用“成员变量”(有时称为“对象属性”、“实例变量(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 做两件事:

  1. 获取一些新鲜的内存,正好足以存储类中定义的所有成员变量
  2. 在该新对象上调用特殊方法以允许我初始化我的对象

因此,如果您调用new两次,您会为 2 个对象获取足够的内存,依此类推。PHP 使用您的类定义来确定要为您分配多少内存,并找到要调用的特殊方法。

该特殊方法称为__construct,并保证在创建对象时调用,该特殊$this变量指向您闪亮的新内存。这是您如何使用它的示例:

class Foo {
 private $createdTime;
 public function __construct() {
  $this->createdTime = time();
 }
}

$myFoo = new Foo;

即使您没有看到它,它也__construct() 调用并且 的值已$createdTime被初始化。

于 2012-09-01T03:36:34.280 回答
0

这是正确的,但语法应该是:

$time = new Time();
$time->GetTime();

(不要忘记括号,否则你指的是类属性)

此外,最好将您的方法声明为公共、受保护或私有。如果要从类外部调用 GetTime 方法,则它需要是公共的。

于 2012-09-01T03:17:47.050 回答
0

是的,基本上你的假设是正确的(除了语法错误)。

然而,这不是一个很好的 OO 设计。

看看这个,它给出了一些 OO 设计的好例子:http: //www.math-cs.gordon.edu/courses/cs211/ATMExample/

于 2012-09-01T03:18:02.680 回答
0

由于在这种情况下“获取时间”永远不会改变并且不接受任何参数,因此您最好将其放入静态方法中,因为在这种情况下实例化一个类是一种浪费

例如:

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();
于 2012-09-01T03:39:00.637 回答
0

在我看来,您这样做是正确的,但是对于使用简单的内置日期函数,通过类使用它可能会使它过于复杂。

下面是一篇优秀的 PHP 学习 OOP 的文章 PHP OOP 初学者

于 2014-10-27T07:25:55.430 回答