哪些PHP OOP示例是PHP OOP结构的“常见”实践?

时间:2010-11-28 13:17:18

标签: php oop

嘿所有人。超越以下两个OOP示例的目的,这被认为是常见的还是正确的结构?或者只是偏好?

示例1:

class names
{
    private $first_name;

    public function setUpperCase($first_name)
    {
        $this->first_name = ucfirst($first_name);
    }

    public function viewUpperCase()
    {
        echo $this->first_name;
    }   

}

$names = new names();
$names->setUpperCase("jimbo");
$names->viewUpperCase();

示例2:

class names
{
    public function setUpperCase($first_name)
    {
        $upper_first_name = ucfirst($first_name);

        return $upper_first_name;
    }

    public function viewUpperCase($upper_first_name)
    {
        echo $upper_first_name;
    }   
}

$names = new names();
$uppercase = $names->setUpperCase("jimbo");
$names->viewUpperCase($uppercase);

第一个示例在类结构中设置变量。第二个示例将变量设置为方法参数。两者都完全相同。但哪个是“适当的”?

谢谢大家。的干杯!

5 个答案:

答案 0 :(得分:7)

我的提案

class Name
{
    protected $firstName;

    public function __construct($firstName)
    {
        $this->firstName = $firstName;
    }

    public function getUpperCase()
    {
        return ucfirst($this->firstName);
    }
}

$name = new Name('jimbo');
echo $name->getUpperCase();

答案 1 :(得分:0)

他们没有做同样的事情,因此这不是一个偏好的问题。第一个示例将大写文件名存储在对象中,第二个示例不存储。你想要/需要哪一个取决于具体情况。

答案 2 :(得分:0)

您的第一个代码段是正确的。然而,你的例子并没有真正地封装(原谅双关语)OOP的真正本质。

对象具有属性和方法。属性存储有关对象的信息,方法修改此信息。您的第一个示例通过将名称存储为属性来完成此操作。无论调用哪种方法,firstname属性都会在整个类中持续存在。

在第二个示例中,您根本没有声明属性。您只有两个不相关的方法可以处理自己的数据。在方法之外,您的属性值不存在。

另一种看待这种情况的方法是,如果要添加surname属性和getFullName()方法。例1可以很容易地实现这一点。

class names
{
    private $first_name;
    private $surname;

    public function getFullName()
    {
       return $this->first_name . ' ' . $this->surname;
    }

    public function setUpperCase($first_name)
    {
    $this->first_name = ucfirst($first_name);
    }

    public function viewUpperCase()
    {
    echo $this->first_name;
    }   
}

$names = new names();
$names->setUpperCase("jimbo");
$names->viewUpperCase();

使用示例2,这变得很有意思,因为您必须将两个名称都传递给getFullName()方法才能获得正确的返回值。这违背了创建对象的目的,该对象旨在成为存储所有数据和相关操作的实体。在示例2中,您不存储数据...仅存储操作。

答案 3 :(得分:0)

我要走出去,说第一个例子是"对"根据定义作为对象的方法由属性定义。 看起来您似乎有一个用户类的开头,其名称可以应用某些修改,例如您的大写方法。 第二个例子看起来它可能只是一个实用程序,我不会将它描述为一个真正的对象,因为它没有任何属性。

答案 4 :(得分:0)

OOP的主要原则是可重用代码,因此为用户创建一个类,您应该能够一遍又一遍地重用代码。

每个对象对于一个实体都是唯一的,在大多数情况下,我的意思是下面的例子:

class     identification

User      user id
Curl      Web Address
Logger    Log File

对于一个对象,你应该使用构造函数传递标识,所以user就是这样:

$Robert = new User(12);
$Peter = new User(15);

因为您使用构造函数,每个类只能创建一次,因为它专用于其标识符。

在用户类中,您可以创建如下方法:

public function addFriend(User $User)
{
    //Insert into the database with $User->getID();
}

$Robert->addFriend($Peter);

在对你的课程的具体问候中,我肯定会采用Philippe Gerber的方法,因为这对我来说是标准。

你也应该不考虑Philippe Gerber的方法,他永远不会将变量更改为大写但是会返回该字符串的大写版本,原因是如果你改变了运行时期间字符串的状态可能无法在此过程的后期按预期工作。

如果变量数据已在数据库中或文件中复制,那么您应该只更改变量数据,因此无论您的脚本没有被搞砸都无关紧要。