PHP中类和函数有什么区别?

5
我自己使用了以下代码,它们都给出了相同的结果。那么为什么我们要使用类而不是普通函数?类和函数之间有什么区别。
<?php

class MyClass{

    public $property = "This is My Class Property";

    public function getProperty(){

        echo $this->property."<br />";

    }   

}

$obj=new MyClass();
echo $obj->getProperty();

?>


<?php

    function getProp(){

        $prop="This is My Class Property";

        echo $prop;

    }

    getProp();

?>

8
请查阅“面向对象编程”是什么,并确认你是否理解。如果没有理解,请在此处提出更多问题 :) - mmtauqir
http://www.webdeveloper.com/forum/showthread.php?199467-Differences-between-PHP-Classes-and-Straight-Include-Functions - Giacomo1968
请阅读更多关于面向对象编程(OOP)的内容,不仅限于PHP,而是一般性的。您将在那里找到答案。 - Alexey Kamenskiy
4个回答

20
PHP语言参考手册有关于函数和类的详细信息: http://www.php.net/manual/zh/langref.php 它还解释了PHP的大多数其他特性。如果想学习PHP,那是最好的起点。
函数
函数是语句(代码行)的分组。
例如以下语句:
$name = 'mary';
$gender = 'girl';
if ($gender == 'girl') {
  $line = $name . ' had a little pony.';
} else if ($gender == 'boy') {
  $line = $name . ' had a little horse.';
}
echo $line;

可以将它们分组成一个函数,这样就可以重复使用:

getSentence('mary', 'girl');
getSentence('peter', 'boy');
function getSentence($name, $gender) {
  if ($gender == 'girl') {
    $line = $name . ' had a little pony.';
  } else if ($gender == 'boy') {
    $line = $name . ' had a little horse.';
  }
  echo $line;
}

请注意这两个函数调用:

getSentence('mary', 'girl');
getSentence('peter', 'boy');

这两个语句运行getSentence函数中的整个代码块,并将变量$name和$gender传递给它。 在第一个功能中,$name = 'mary'$gender = 'girl',在第二个功能中,$name = 'peter'$gender = 'boy'
因此,函数的主要好处是您可以分组重复使用的代码,允许传递函数需要的不同变量值。这些变量称为函数参数。
另一个好处是代码更易于阅读。您实质上给代码块命名并赋予其特定目的。这使得阅读和记住其用途变得容易。
另一个好处是删除了冗余。您不必多次编写代码块。只需定义一次,然后调用多次即可。这也使得编辑函数代码会影响对该函数的所有调用,从而减少了在更改一个方面时必须编辑多个位置的错误。
例如:
我们可以确保$name字符串具有大写字母开头的字符。
function getSentence($name, $gender) {
  $name = ucfirst($name);
  if ($gender == 'girl') {
    $line = $name . ' had a little pony.';
  } else if ($gender == 'boy') {
    $line = $name . ' had a little horse.';
  }
  echo $line;
}

我们只进行了一次修改,却影响了每次对getSentence()的函数调用。在这种情况下,两个函数都受到了影响:

getSentence('mary', 'girl'); 

并且
getSentence('peter', 'boy'); 

类是函数的分组。

class Play {
  function getSentence($name, $gender) {
    $name = ucfirst($name);
    if ($gender == 'girl') {
      $line = $name . ' had a little pony.';
    } else if ($gender == 'boy') {
      $line = $name . ' had a little horse.';
    }
    echo $line;
  }
  function getSong($name) {
    // code here
  }
}

我们所做的只是将其放置。
class Play { /** functions here **/ }

围绕一组函数。

这提供了与语句相同的功能,但是类对于函数而言更进一步。

类更进一步构建了一种编程方法论,称为面向对象编程(OOP),你可以在 PHP 语言参考链接中阅读更多相关信息。

这将类定义为对象的模板或定义。对象类似于现实世界的对象,其中被称为“方法”的功能可以用于调用该对象。

因此,类 Play 可以被视为名为“Play”的对象,具有方法“getSentence”和“getSong”。然后,这些方法可以操纵对象“Play”的属性或返回有用的关于“Play”的信息。通过这种方式,Play 中的所有代码变得独立于程序中其他代码。

当 Play 中的代码需要某些其他代码才能运行时,可以使用“继承”将其引入,这是 OOP 的重要组成部分。由于这是一个非常广泛的主题,我不会详细介绍。

我建议获取一本关于 OOP 的书籍并阅读它,以真正理解何时应该使用类和方法以及如何使用它们。


1
感谢您的回答,웃웃웃웃웃先生/女士。 :) - Manǒj κiψàη
1
欢迎 @Śĭr.μàηǒʝκĭψàη。祝你编程愉快。 - Deepu
很好的解释!读一本书并不能讲得这么清楚明白,我是编程新手,已经读了几本书,甚至搜索了差异。是的,我理解它们之间的学术差异,但我还没有应用过。我仍然将我的代码写成函数的形式,这确实有帮助。 - user2004820

1
任何函数都可以使用关键字new作为构造函数进行调用,该函数的原型属性用于让对象从中继承方法。
函数是一组指令或程序,用于完成某个特定任务。例如,射击枪支有一组可执行的程序,如抬起枪支,瞄准等。
然而,这些程序彼此依赖。单独抬起枪支毫无意义。
在类中,您可以创建对象。
在对象中,您可以创建例如枪支之类的物体。这种枪支有与之相关联的不同功能,例如举起枪支,瞄准。
实际上,对象可以自行存在,并且可以重复使用以供将来使用。
class SimpleClass
{
    // property declaration
    public $var = 'a default value';

    // method declaration
    public function displayVar() {
        echo $this->var;
    }
}

所以当你想要使用类对象时,需要声明。
$objectSimple = new SimpleClass();

当您想使用类方法时,您需要声明。

$objectSimple->displayVar();

如您的示例所示。
<?php

class MyClass{

    public $property = "This is My Class Property";

    public function getProperty(){

        echo $this->property."<br />";

    }   

}

$obj=new MyClass();
echo $obj->getProperty();

?>


<?php

    function getProp(){

        $prop="This is My Class Property";

        echo $prop;

    }

    getProp();

?>

是的,你们两个都可以工作。在审查了你的样本之后,似乎你正在询问面向对象编程与过程化编程。

在我看来,它们实际上没有任何优缺点。它们只是解决同样问题的不同方法。

在纯粹的过程式风格中,数据往往与操作它的函数高度分离。

在面向对象的风格中,数据往往带有一组函数。

在函数式风格中,数据和函数趋向于彼此更相似(如Lisp和Scheme),同时在实际使用函数方面提供更多的灵活性。算法也往往是用递归和组合来定义,而不是用循环和迭代。

当然,语言本身只影响哪种风格更受欢迎。


0
你可以说一个类只是一组函数,但实际上它远不止于此。
把一个类看作是一组用于操作相同数据量的函数。
比如从数据库中获取一个用户。如果你的成员系统有任何复杂性,你需要在多个页面上分配许多变量。
更简单的方法是...
$user = new user(2)[/php)  (assuming user is the class, and 2 is the userid it pulls from the databse, your contructor function would populate all of the users information, which is easily grouped together and used like...

[code=php:0]print "Hello ". $user->firstName . " welcome to thiswebsite. Your last login was " . $user->lastLogin

这只是一个小而愚蠢的例子,但如果你让自己思考一下可能性(这不是唯一的可能性,多态性是类的另一个伟大特性),那么它就变得非常有意义。


0
通常当你使用一个函数时,你意图只从中获取一次信息,然后函数将忘记它发送给你的数据(除非你在其中创建了一个站点变量或常量...)
如果您想继续使用信息,则可能需要创建一个类。例如,客户登录并希望查看关于其帐户的六个不同页面。您可能需要创建一个类,以便在客户登录时立即获得有关该客户的信息,无需不断调用sql来获取。
也许您希望在屏幕顶部放置他们的状态和付款信息。当他们登录时,您会在构造函数中获取此信息。然后无论他们转到哪一页,这些信息都将迅速可用。

1
你能发一个例子吗? - mandza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接