PHP中的新手,请求澄清概念

时间:2015-07-29 15:00:53

标签: php oop

我喜欢PHP语言,我有一些编码经验,但我对PHP很新,虽然我已经学到了很多东西我觉得我现在因为没有掌握OOP概念而陷入困境,尽管我已经浏览多个教程。

这不是关于代码本身的问题,而是背后的逻辑

考虑我从

开始工作的这个教程
class person { 
    var $name; 
    function set_name($new_name) { 
        $this->name = $new_name;
    } 
    function get_name() { 
        return $this->name 
    } 
} 

$stefan = new person();
$jimmy = new person;   
$stefan->set_name("Stefan Mischook"); 
$jimmy->set_name("Nick Waddles");  

echo "Stefan's full name: " . $stefan->get_name(); 
echo "Nick's full name: " . $jimmy->get_name(); ?> 

我理解上面发生了什么,我理解这个概念,但我看不出它的好处,我只是觉得我可以通过简单的方式以更简单的方式创建上述

function person($name){
    return $name;
}
echo person("Tim Jones");
  • 为什么getter和setter函数,为什么不只是类中的一个函数?
  • 为什么在我上面的函数变得如此短的时候仔细阅读上面的所有代码?
  • 这里的好处在哪里?

我基本上只是想找个人给我一些关于整个OOP概念的澄清,我似乎无法通过我读过的许多重复教程得到它。

4 个答案:

答案 0 :(得分:2)

OOP的优点在于,任何对类或对象起作用的东西都不需要知道该类或对象是如何工作的,并且可以在后台完成更复杂的事情,因为大部分应用程序都是un -involved,使您的代码更具可读性。

考虑以下[部分]伪代码网络应用程序示例:

$users = array();
$users[] = new User('joe', ADMIN, ACTIVE);
$users[] = new User('jane', ADMIN, ACTIVE);
$users[] = new User('bill', USER, INACTIVE);

class User {

    public $Name;
    public $Security;
    public $Active;

    public function __construct($name, $security = USER, $active = INACTIVE) {
        $this->Name = $name;
        $this->Security = $security;
        $this->Active = $active;
    }

    public function ToggleActive() {
        //Not actual working code ahead
        $this->Active = ($this->Active) ? INACTIVE : ACTIVE;
        $sql->query('UPDATE users SET active=$this->Active WHERE name=$this->Name');
    }

    public function SetSecurity($security) {
        //More non-functional examples
        $this->Security = $security;
        $sql->query('UPDATE users SET security=$this->Security WHERE name=$this->Name');
    }

}

?>

<html>
    <form>
        <!-- this is, of course, the wrong markup, but the concept is there-->
        foreach($users as $user) {
            <name>$user->Name</name>
            <security>$user->Security <button $user->SetSecurity(ADMIN)>Set Admin</button> <button $user->SetSecurity(User)>Set User</button>
            <active>$user->Active <button $user->ToggleActive>Toggle Active</button>
        }
        <!-- you could even have the class itself output the form html with something like $user->DrawEntryHTML();-->
    </form>
</html>

显然,这种操作(AJAX,函数处理程序等)的Web应用程序界面还有很多内容,但基础知识在那里,只有用户对象本身需要知道如何执行操作。您应用的其余部分可以简单地说Hey, user. You're active now.

OOP为您提供了一种抽象但有意义的方式来完成您希望应用程序组件执行的操作。在当今的大多数应用程序中,当用户进行交互或任务发生时,需要进行许多事情来存储,显示和修改其元素。您还可以获得以下优势:只需要在更改,更新或添加功能时更改类中的一小部分代码,而不是在代码的其余部分中追踪与用户相关的所有内容(在此处情况)。

你会发现一个写得很好的OOP应用程序有一个非常短的程序循环(或index.php),而且大部分工作都发生在它的类对象中。

答案 1 :(得分:2)

使用类的一个好例子是您可能希望稍后扩展或重写功能。

几年前,我用PHP编写了一个用于在Jira中创建问题的应用程序。此时,我使用SOAP来使用已发布的API

执行实际的问题创建和更新

稍后,在同一个应用程序中,我需要使用Jira中与Atlassian Greenhopper / Agile扩展相关联的功能。这个扩展使用了一个REST API,很明显Atlassian正在将所有的API转移到使用REST

由于我使用了一个类来调用Jira,所以后台的所有实际工作都被抽象了。我知道预期的数据和我期待的数据

最后,我编写了一个新类来使用REST(通过cURL调用),并重新编写了访问Jira的类。我没有必要通过整个应用程序并检查每次调用Jira函数,因为数据和数据输出是相同的。

实际上,我写的所有类都来自REST类:

  • REST - &gt; JIRA_BASE - &gt; JIRA

JIRA_BASE类包含所有Jira项目中常见的方法(获取项目名称,获取用户ID等)。 JIRA类本身包含一些函数(createJiraIssueupdateJiraIssue),这些函数对每个Jira项目都是特定的

使用类和对象的另一个好处是,您可以将占位符放入函数中。在REST类中,尝试使用DELETE方法(而不是GETPOSTPUT)进行REST调用会立即出错(我没有&#39;写它,因为我不需要它)。但是,我在另一个应用程序中重用了同一个类,我确实需要使用DELETE方法,所以现在写了

很明显,新应用程序需要在功能的一个方面进行更改。这是在不重写任何调用代码的情况下实现的

Getters setters 用于确保以受控方式访问数据。如果您只是在脚本中使用变量,那么该脚本的任何部分都可能会更改数据。如果该数据存储在类中并设置为private,则只有对getter或setter的调用才能更改或检索该数据。

此外,getter和setter可以改变数据实际存储的方式,但仍然以可用的格式呈现。例如,在执行

的调用时
$obj -> setName('DaveyBoy');

可以将数据反转,转义,加密,存储在会话变量中,发送到数据库并rot13(无特定顺序)。但是,打电话给

$name  = $obj -> getName()

仍将存储DaveyBoy&#39;在$name中没有任何干预步骤。

我对课程和我使用它们的原因大加赞赏,但是,希望,这有助于解释一下。

答案 2 :(得分:1)

考虑当你想要改变代码的行为时会发生什么 - 假设它已经运行了一段时间,你发现你有很多重复记录,其中人们在空白和大写中使用了变体。您可能希望将代码修改为....

 function set_name($new_name) { 
    $new_name=trim(strtoupper($new_name));
    $new_name=str_replace('  ',' ', $new_name);
    $new_name=str_replace('  ',' ', $new_name);
    $name_parts=explode(' ', $new_name);
    $this->surname=array_pop($name_parts);
    $this->forenames=implode(' ', $name_parts);
 } 
 function get_name()
 {
    return $this->forenames . ' ' . $this->surname;
 }

但您无需更改与对象交互的任何代码。

现在想想一个描述组织而不是个人的类 - 他们有名字 - 但不是名字和姓氏。如果您有一个具有相同接口的类(get_name,set_name),那么您可以在圣诞卡打印机应用程序中抛出一组人和组织,而无需修改应用程序以应对不同的数据类型。

(由于某种原因,教程示例保持非常简单,不幸的是,OO的许多好处只有在处理复杂问题时才会变得明显 - 坚持下去并且你会到达那里)

答案 3 :(得分:1)

请注意,我的回答并不是关注OOP的主要优势,因为您已经阅读了这些优点并且 - 因为它们目前不适用于您的情况 - 是没有意义的。我将专注于OOP现在能为你做些什么。

你给出的例子实际上是一个好例子。

说你还想把身高,体重,生日和职业都附在一个人身上。

不使用可以创建数组数组的对象(用于存储具有多个属性的多个人),但在编码后2小时,您将尝试访问人员作业:

echo $persons[0]['job'];

它会失败,因为该字段实际上被命名为'职业'; 使用对象不仅会让您的IDE了解吸气剂,它也会对您有所帮助。

OOP的主要优势只有当您在团队中工作或公开代码供其他人使用时才能真正看到,但是我给出的示例应该足以理解为什么即使作为单个开发人员也有好处。

话虽如此,对于过于简单化的行为,它可能有点过分。