новичок ... запутался в переменных с одинаковыми именами внутри одной функции - PullRequest
2 голосов
/ 26 февраля 2012
 1   <?php  
 2   class ACL  
 3   {  
 4       var $perms = array();        //Array : Stores the permissions for the user  
 5       var $userID = 0;            //Integer : Stores the ID of the current user  
 6       var $userRoles = array();    //Array : Stores the roles of the current user  
 7 
 8       function __constructor($userID = '')  
 9       {  
 10           if ($userID != '')  
 11          {  
 12               $this->userID = floatval($userID);  
 13           } else {  
 14               $this->userID = floatval($_SESSION['userID']);  
 15          }  
 16           $this->userRoles = $this->getUserRoles('ids');  
 17           $this->buildACL();  
 18       }  

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

Это объяснение, данное в руководстве:

Функция __constructor () используется для инициализации объекта, когда мы хочу загрузить ACL. Он вызывается автоматически, когда мы вызываем новый (ACL) ;. Затем передается единственный необязательный аргумент пользователя загрузить ACL для. Внутри конструктора мы проверяем, есть ли идентификатор пользователя был передан. Если ID не был передан, мы предполагаем, что мы загрузим ACL для текущего авторизованного пользователя; поэтому мы читаем на сессии переменная для этого. В качестве альтернативы, если мы передадим идентификатор пользователя, это позволит нам читать и редактировать ACL для пользователя, который не вошел в систему (полезно для вашей страницы администратора).

Вопрос № 1 ... поэтому этот метод запускается, как только вы создаете новый класс, и принимает логическое значение в качестве аргумента. Я не понимаю, зачем вам нужно указывать тот факт, что userID = ''. Не могли бы вы просто упростить и написать: function __constructor ($ userID) {if ($ userID! = '') ........ и т. Д. так далее. ?? Или они имеют в виду одно и то же? Идея указать логическое значение никогда не имела для меня смысла, особенно когда вы не используете его в операторе IF для проверки его правильности.

РЕДАКТИРОВАТЬ: я сделал очень странный промах. Извините, не обращая внимания на всю логическую вещь, это даже не логическое утверждение. Моя ошибка ... 12 часов обучения программированию берут свое.

Вопрос 2: переменная $ userID в строке 5 совпадает с переменной $ userID в строке 8? Я думаю нет, но я не уверен. Я уверен, что $ userID в строке 5 совпадает с $ this-> userID в строке 12 и строке 15, но как насчет строки 8 и 10? Я сбит с толку. Если переменная $ userID в строке 8 НЕ пуста, то вы присваиваете $ userID, найденный в строке 5, с плавающей точкой $ userID в строке 8 ?? У меня такое ощущение, что это 2 разных $ userID. Почему этот парень не может использовать другое слово, если это так? LOL

ПРИМЕЧАНИЕ: я изучаю PHP меньше недели, поэтому они больше всего покажутся базовыми концептуальными вопросами. Синтаксис на самом деле не проблема для меня, это концепции.

Любая помощь приветствуется. Приветствия.

Ответы [ 5 ]

2 голосов
/ 26 февраля 2012

Хорошо,

  1. Метод не используется каждый раз, когда вы «создаете новый класс», он вызывается каждый раз, когда объект создается , то есть каждый раз, когда new ClassName() заявление называется.Причина использования function __construct($userID = ''), а не function __construct($userID), заключается в том, что мы хотим присвоить ему значение по умолчанию .Это означает, что пользователь может позвонить new APC() или new APC("userID").
  2. Нет.Объект, объявленный в строке 5, является свойством объекта , это переменная, которая существует внутри каждого объекта (то есть, если вы создадите 2 класса APC, у вас будет одна переменная для каждого созданного объекта, всего 2).
    Тот, что в строке 8, является аргументом функции.Когда метод вызывается с аргументом (new APC("userID")), этот аргумент будет сохранен в этой переменной внутри функции.
    По совпадению, оба они имеют одинаковые имена.
1 голос
/ 26 февраля 2012

1.

function helloWorld($whattosay = 'Hello World') {
     echo $whattosay;
}

helloWorld()
// prints Hello World

helloWorld("kthxbai")
// prints kthxbai

2.

$ this-> userID означает «ЧТЕНИЕ ПЕРЕМЕННОЙ ИЗ ЛИНИИ 5»

line10 = line8

$ это текущая (изнутри) копия (экземпляр) класса ACL.

Он не использует другое слово, потому что идея состоит в том, чтобы сообщить, что все, что вы положили между () в новый ACL (), будетстать $ this-> userID в копии (экземпляре) ACL.

1 голос
/ 26 февраля 2012

вопрос 1: $userID передается в качестве дополнительного аргумента функции-конструктору класса.это означает, что вы можете создать экземпляр объекта этого класса либо с нашим, не передавая идентификатор пользователя:пример:

$acl = new ACL(); //valid
$acl = new ACL($aUersId); // also valid

Вопрос2: $ userID в строке 5 является свойством класса.доступ к нему осуществляется из конструктора в строке 12 с использованием $this->userID.$ userID в строке 10 существует только внутри функции.

1 голос
/ 26 февраля 2012

Это не логический аргумент, это аргумент со значением по умолчанию, который является пустой строкой.Если вы не установите значение по умолчанию и создадите экземпляр одного объекта из этого класса, он выдаст ошибку, потому что один аргумент будет пропущен.

Нет, они не совпадают.Одна - это объектная переменная, а другая - переменная аргумента.

Имейте в виду: этот код действительно старый (ключевое слово var, все общедоступно и т. Д.)

1 голос
/ 26 февраля 2012

Это не логическое значение.Это значение по умолчанию.Поэтому, если вы вызываете функцию без параметра, она считает $userId равным "".

Примечание = - это оператор присваивания, а == - оператор сравнения.

...