初学者......对同一个函数中的同名变量感到困惑

时间:2012-02-26 10:17:20

标签: php oop boolean

 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。当我们调用new时会自动调用它   ACL();.然后将它传递给用户的单个可选参数   加载ACL。在构造函数中,我们检查是否有用户ID   传入。如果没有传递ID,我们假设我们将加载   当前登录用户的ACL;所以我们在会议上阅读   变量。或者,如果我们传入用户ID,它允许   我们为除登录用户之外的用户读取和编辑ACL   (对您的管理页面很有用)。

问题#1 ...所以这个方法一旦你创建一个新类就会启动,并且它将boolean作为参数。我不明白为什么你需要陈述userID =''的事实。难道你不能简单地写一下:function __constructor($ userID){if($ userID!='')........等。等??或者他们的意思是一样的吗? 陈述布尔的想法从来没有对我有意义,特别是当你没有在IF语句中使用它来测试它的有效性时。

编辑:我做了一个非常奇怪的单调。抱歉忽略整个布尔值,它甚至不是布尔语句。我的错误...... 12个小时的学习编程正在造成损失。

问题2:第5行中的变量$ userID与第8行中的$ userID相同吗?我想不,但我不确定。我确定第5行的$ userID与第12行和第15行的$ this-&gt; userID相同,但是第8行和第10行呢?我很迷惑。如果第8行的变量$ userID不是空白,那么你将第5行的$ userID分配给第8行$ userID的floatval? 我觉得这些是2个不同的$ userID。如果是这样的话,为什么这个家伙不能只使用不同的词呢? LOL

注意:我已经学习了不到一周的PHP,所以这些看起来像是基本的概念问题。语法对我来说不是一个问题,它是概念。

任何帮助表示赞赏。欢呼声。

5 个答案:

答案 0 :(得分:2)

好,

  1. 每次“创建一个新类”时都不会使用该方法,每次实例化一个对象时都会调用该方法,这意味着每次调用new ClassName()语句时都会这样。使用function __construct($userID = '')而不是function __construct($userID)的原因是因为我们想要给它一个默认值。这意味着用户可以拨打new APC()new APC("userID")
  2. 否。在第5行声明的是对象属性,它是每个对象中存在的变量(意味着如果实例化2个APC类,则每个创建的对象将有一个变量,总共2个)。
    第8行的一个是函数参数。当使用参数(new APC("userID"))调用该方法时,该参数将存储在函数内部的该变量中 巧合的是,他们俩都有相同的名字。

答案 1 :(得分:1)

这不是布尔值。这是默认值。因此,如果您在没有参数的情况下调用函数,则会将$userId视为""

注意=是赋值运算符,==是比较运算符。

答案 2 :(得分:1)

问题1:$userID作为optinal参数传递给类的构造函数。这意味着您可以使用我们实例化此类的对象而不传递用户ID:
例如:

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


问题2:第5行中的$ userID是一个类属性。它是使用$this->userID从第12行的构造函数访问的。第10行中的$ userID仅存在于函数内部。

答案 3 :(得分:1)

这不是一个布尔参数,它是一个带有默认值的参数,它是一个空字符串。如果你没有设置默认值并且你从这个类中实例化一个对象,那么就会抛出一个错误,因为一个参数会丢失。

不,他们不一样。一个是对象变量,另一个是参数变量。

建议:此代码非常旧(var关键字,everthing是公共的等等)

答案 4 :(得分:1)

1

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

helloWorld()
// prints Hello World

helloWorld("kthxbai")
// prints kthxbai

2

$ this-&gt; userID表示“从第5行读取变量”

line10 = line8

$这是ACL类的当前(来自内部)副本(实例)。

他没有使用不同的词,因为我的想法是传达你在新ACL()中放置的任何内容()将成为ACL的副本(实例)中的$ this-&gt; userID。