繁体   English   中英

在PHP中使用类/ OOP

[英]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类中定义)

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

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

您可以将对象视为本质上由两部分组成的集合:

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

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

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

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

因此,如果您两次调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM