2010-11-28 2 views
1

Эй, все. Выходит за рамки следующих двух примеров ООП, которые считаются общими или правильными структурами? Или это просто предпочтение?Какой из этих примеров PHP OOP является «общей» практикой структуры PHP 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); 

Первый пример устанавливает переменную в структуре класса. Второй пример устанавливает переменную как аргумент метода. Оба делают то же самое. Но что является «правильным»?

Спасибо всем. Приветствия!

+0

Не зависит ли это от того, понадобится ли вам значение $ upper_first_name позже в этом экземпляре класса? – o01

+0

Несомненно. Но что, если это был весь класс? Не задумываясь о «цели» сценария, какой из двух примеров является «общей» структурой? – Tableking

ответ

0

Im собирается выйти на конечность и сказать, что первым примером будет «правильный» метод, поскольку объект по определению определяется свойствами. Кажется, что у вас есть начало пользовательского класса, у которого есть имя, которое может иметь определенные модификации, например, ваш заглавный метод. Второй пример выглядит так, как будто это просто утилита, и я бы не описал его как истинный объект, так как он не имеет никаких свойств.

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(); 
+0

+1 Определенно, самый чистый метод. Это должно быть принято! –

0

Они не делают одно и то же, и, следовательно, это не вопрос предпочтений. В первом примере хранится верхнее имя файла в объекте, а второе - нет. Какой из них вам нужен/нужен, зависит от ситуации.

0

Ваш первый сегмент кода является правильным. Однако ваши примеры не содержат инкапсуляцию (извините за каламбур) реальную сущность ООП.

Объекты имеют атрибуты и методы. Атрибуты хранят информацию об объекте, а методы изменяют эту информацию. Ваш первый пример делает это, сохраняя имя как атрибут. Независимо от того, какой метод вызывается, атрибут firstname сохраняется во всем классе.

Во втором примере вы вообще не объявляете атрибут. У вас просто есть два несвязанных метода, которые работают с собственными данными. Вне метода ваше значение атрибута не существует.

Другой способ взглянуть на это, если вы хотите добавить атрибут фамилии и метод 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 вы не храните данные ... только операции.

+0

Возможно, использование конструктора в качестве фамилии является излишним? – RobertPitt

0

Основным принципом ООП является Код многократного использования, поэтому создайте класс для пользователя, который вы сможете повторно использовать код снова и снова.

Каждый объект является уникальным для лица, в большинстве случаев, пример того, что я имею в виду ниже:

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 «s, как это для меня является стандартом.

Вы также должны принять не то, что в методе Philippe Gerber он никогда не меняет переменную на верхний регистр, но мутный возвращает версию этой строки в верхнем регистре, причина в том, что если вы изменили состояние строка во время выполнения может не работать, как ожидалось, в дальнейшем.

Вы должны всегда изменять данные переменных только в том случае, если они были реплицированы в базу данных или в файл, поэтому не важно, что ваш скрипт не запутался.