Некоторое объяснение о вызове функции PHP в классе - PullRequest
2 голосов
/ 23 апреля 2019

Я знаю, что это основной вопрос php, но у меня было что-то, чего я не понимал, речь идет о return;, когда я вызываю функцию, приведенный ниже код является просто примером.

Случай: В TEST2 когда я делаю свою проверку, я возвращаюсь, что return; выполняет работу и останавливает выполнение следующего кода TEST3 Хорошо.

Теперь в TEST1 Я вызываю функцию _checkThat(), и эта функция выполняет проверку, а затем перенаправляет. проблема в том, что он возвращает shure, но следующий код также будет выполнен TEST2 и TEST3 Почему? почему, когда я помещаю содержимое этой функции прямо в TEST1, она возвращает и останавливает выполнение следующего кода?

<?php class Some_Class_IndexController extends Some_Other_Controller_Front_Action
{
    $name = $this->getRequest()->getParam('name'); //Output: "john"
    $email = $this->getRequest()->getParam('email'); //Output: "john@gmail.com" 
    $phone = $this->getRequest()->getParam('phone'); //Output: 09000000       

    //TEST1
    if(isset($name)) {
        $this->_checkThat($name);
    }

    //TEST2
    if(isset($email)) {
        if($email === "john@gmail.com") {
            //some code to redirect to another page
            return;
        } else {
            //some code to redirect to another page
            return;
        }
    }

    //TEST3
    if(isset($name)) {
        $this->_checkthat();
    }

    private function _checkThat($name) {
        if ($name !== "john") {
            //some code to redirect to another page
            return;
        }
    }
}

Другой вопрос, могу ли я использовать continue; в этом случае:

if(isset($name)) {
    Mage::log('check passed'); //This just write in logs
    continue; // or something else
} else if (!isset($name)) {
    // some code
}

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Хотя, как уже упоминалось в комментариях, ваш пример кода неверен, ваша проблема здесь:

if(isset($name)) {
    $this->_checkThat($name);
}

в том, что вы ничего не делаете с результатом, возвращаемым _checkThat().И, очевидно, вы должны return it:

if(isset($name)) {
    return $this->_checkThat($name);
}

В качестве идентификатора я должен упомянуть, что имена методов с _ для их пометки protected / private отсутствуютпрактика с php5.

0 голосов
/ 23 апреля 2019

Вот простое руководство.

Наследование - повторное использование кода способом ООП

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

Почему это?

Это позволяет вам эффективно повторно использовать код, найденный в вашем базовом классе.

Скажем, вы хотели создать новый employee class, поскольку мы можем сказать, что employee - это тип / тип "персона", они будут иметь общие свойства и методы.

Есть смысл?

В такой ситуации наследование может сделать ваш код легче, потому что вы повторно используете один и тот же код в двух разных классах. Но в отличие от old-school PHP:

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

Взгляните на пример кода PHP:

// 'extends' is the keyword that enables inheritance
class employee extends person 
{
    function __construct($employee_name) {
        $this->set_name($employee_name);
    }
}

Повторное использование кода с наследованием:

Поскольку класс employee основан на классе person, employee автоматически имеет все открытые и защищенные свойства и методы "person".

Примечание ботаника: Ботаники скажут, что employee - это тип человека.

код:

class employee extends person 
{
    function __construct($employee_name){
        $this->set_name($employee_name);
    }
}

Обратите внимание, как мы можем использовать set_name () в employee, хотя мы не объявляли этот метод в классе employee. Это потому, что мы уже создали set_name () в классе person.

Nerd Примечание: класс person называется (для ботаников) классом base или parent, потому что это класс, на котором основан employee. Эта иерархия классов может стать важной в будущем, когда ваши проекты станут более сложными.

Повторное использование кода с наследованием:

Как вы можете видеть из фрагмента кода ниже, мы можем вызвать get_name для нашего employee объекта, любезно person.

код:

<?phpinclude("class_lib.php"); ?>
    <?php
        // Using our PHP objects in our PHP pages. 
        $stefan = new person("Stefan Mischook");
        echo "Stefan's full name: " . $stefan->get_name();

        $james = new employee("Johnny Fingers");
        echo "---> " . $james->get_name();
    ?>

Это классический пример того, как ООП может уменьшить количество строк кода (не нужно писать одни и те же методы дважды), сохраняя при этом ваш код модульным и намного проще в обслуживании.

Переопределение методов 1

Иногда (при использовании наследования) вам может понадобиться изменить способ работы метода из базового класса.

Например, скажем, метод set_name () в классе 'employee' должен был сделать что-то отличное от того, что он делает в классе person.

Вы override версия person классов set_name (), объявив тот же метод в employee.

Фрагмент кода:

<?php
    class person 
    {
        protected function set_name($new_name) {
            if ($new_name != "Jimmy Two Guns") {
                $this->name = strtoupper($new_name);
            }
        }
    } 

    class employee extends person 
    {
        protected function set_name($new_name) {
            if ($new_name == "Stefan Sucks") {
                $this->name = $new_name;
            }
        }
    }
?>

Обратите внимание, что set_name () отличается в классе employee от версии, найденной в родительском классе: person.

<<strong> Методы переопределения: 2

Иногда вам может понадобиться получить доступ к версии вашего базового класса метода, который вы переопределили в производном (иногда называемом "дочернем") классе.

В нашем примере мы переопределили метод set_name () в классе employee. Теперь у меня есть использовал этот код:

hperson::set_name($new_name);

для доступа к родительской версии класса (person) метода set_name ().

код:

<?php
    class person 
    {
        // explicitly adding class properties are optional - but 
        // is good practice
        var $name;   
        function __construct($persons_name) {
            $this->name = $persons_name;
         }

         public function get_name() {
            return $this->name;
         }

         // protected methods and properties restrict access to 
         // those elements.
         protected function set_name($new_name) {
             if ($this->name !=  "Jimmy Two Guns") {
                $this->name = strtoupper($new_name);
             } 
         }
    } 

    // 'extends' is the keyword that enables inheritance
    class employee extends person 
    {
        protected function set_name($new_name) {
            if ($new_name ==  "Stefan Sucks") {
                $this->name = $new_name;
            }
            else if ($new_name ==  "Johnny Fingers") {
                person::set_name($new_name);
            } 
          }

        function __construct($employee_name) 
        {
            $this->set_name($employee_name);
        }
    }
?>

Примечания: Использование символа:

::

… позволяет вам конкретно назвать класс, в котором вы хотите, чтобы PHP искал метод:

person::set_name() … Говорит PHP, что нужно искать set_name () в классе person.

Существует также ярлык, если вы просто хотите обратиться к родителю текущего класса - с помощью ключевого слова parent.

код:

protected function set_name($new_name) 
{   
    if ($new_name ==  "Stefan Sucks") {
        $this->name = $new_name;    
     }  
     else if ($new_name ==  "Johnny Fingers") {
        parent::set_name($new_name);    
    }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...