在PHP中使用Classes / OOP

时间:2012-09-01 03:14:42

标签: php oop

我非常精通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'

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

5 个答案:

答案 0 :(得分:6)

关于方法调用

我会对你的陈述进行一次修改,更准确地暗示对象定位是什么。您的评论如下:

  

在'时间类'中运行'GetTime'功能

这只是有点准确,并阐述它可能会为您澄清OOP。出于本文的目的,我可能会这样改写:

  

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

看到区别?您不只是从类中调用函数,而是说“从类中获取处理指令,但将这些指令绑定到此特定对象然后执行。

这可能听起来像是在敲词,但这对理解封装至关重要。类的对象共享其方法定义,但不共享数据

您可以将对象视为一组两件事:

  1. 拥有自己的个人数据的内存块
  2. 指向一组具有对该数据的特殊访问权限的方法的指针
  3. (方法与数据关系的“特殊”性质是隐式或显式的,取决于你)

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

    1. 获取一些新的内存,足够来存储在类中定义的所有成员变量
    2. 在该新对象上调用一个特殊方法,以允许我初始化我的对象
    3. 因此,如果您两次调用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