在PHP中使用类/OOP

在PHP中使用类/OOP,php,oop,Php,Oop,除了OOP之外,我对PHP非常精通——我现在刚刚开始学习OOP 我一直在看视频和阅读教程,但它们仍然相当混乱 如果我有 文件1(class.time.php) 然后在另一个php页面中 文件2(page.php) 我能行 include('class.time.php'); 然后我可以在这页的任何地方 $time = new Time; //Calling the class and setting the class to a variable $time->GetTime(); //

除了OOP之外,我对PHP非常精通——我现在刚刚开始学习OOP

我一直在看视频和阅读教程,但它们仍然相当混乱

如果我有

文件1(class.time.php)

然后在另一个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'

我的主要问题是,上面的评论(基本上是说……)正确吗?或者有更好的方法来考虑它吗?

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

$time = new Time();
$time->GetTime();
(不要忘记括号,否则您指的是类属性)


另外,最好将方法声明为public、protected或private。如果要从类外部调用GetTime方法,它需要是公共的。

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

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

看看这个,它给出了一些OO设计的好例子:

关于方法调用 我想对你的说法做一个更正,稍微准确地暗示一下物体定向的意义。你的评论是:

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

这只是有点准确,对它的阐述可能会为您澄清OOP。为了这篇文章的目的,我可以这样说:

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

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

这听起来可能有些含混不清,但对理解封装至关重要。类的对象共享其方法定义,但它们不共享数据

您可以将一个对象本质上看作是两件事的集合:

  • 一块存储自己的个人数据的内存
  • 指向对该数据具有特殊访问权限的一组方法的指针
  • (方法与数据关系的“特殊”性质要么是隐式的,要么是显式的,这取决于您)

    当你开始使用“成员变量”(有时称为“对象变量”、“实例变量(AKIARS)”或类似名称)时,这种区分是显而易见的。请考虑这个示例代码:

    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
    对我的总体意图特别感兴趣,答案如下:同一方法定义中的同一变量实际上指向不同的对象,具体取决于调用该方法的对象

    关于新的
    
    现在转到上一行,您的注释如下(关于
    $time=new time
    ):

    调用类并将类设置为变量

    我会这样说:

    创建该类的实例,并允许我通过$time访问该实例

    在继续之前,instance将是一个需要确定的大概念。您不需要调用类,也不需要调用方法(至少在PHP中)如果将变量的值设置为类,则可以将它们设置为指向类的实例。有时,人们可以互换地使用“实例”和“对象”,这很好。但不应将它们与“类”互换使用

    让我们看一下技术方面的内容

    当您使用
    new
    操作符时,从技术上讲,您是在告诉PHP做两件事:

  • 获取一些新的内存,正好足够存储类中定义的所有成员变量
  • 在新对象上调用一个特殊方法以允许我初始化对象
  • 因此,如果您两次调用
    new
    ,就会为两个对象获取足够的内存,以此类推。PHP使用您的类定义来计算要分配给您的内存量,并找到要调用的特殊方法

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

    class Foo {
     private $createdTime;
     public function __construct() {
      $this->createdTime = time();
     }
    }
    
    $myFoo = new Foo;
    
    即使您没有看到它,也会调用
    \uu construct()
    ,并初始化
    $createdTime
    的值。

    因为在这种情况下,“get time”永远不会更改并且不接受任何参数,所以最好将其放入静态方法中,因为在这种情况下实例化类是一种浪费

    例如:


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

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

    1)记住省略号。2)我倾向于用短语表达它——创建一个名为$Time的新时间对象……调用$Time的GetTime()方法.3)你在
    class.time.php
    中缺少一个结束括号。也许你只是没有复制并粘贴它…^谢谢你的解释,至于3-我在移动中键入了它作为一个简单的例子,因此缺少了括号(尽管我刚刚学习了确保包含
    ()
    。你不需要包含
    ()
    使用
    新的
    操作符,不过你可能应该这样做。你能详细说明一下“public、protected或private”吗?或者指向一些文档吗?我以前没有见过。看起来mihir比我更了解它。记住,访问修饰符(public、protected、private)是在PHP5中添加的,为了保持与PHP4的向后兼容性,任何未声明访问修饰符的方法(如上面的)都将默认为public
    class Foo {
     private $createdTime;
     public function __construct() {
      $this->createdTime = time();
     }
    }
    
    $myFoo = new Foo;
    
    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();