【问题标题】:beginner... confused about same name variables within same function初学者...对同一函数中的同名变量感到困惑
【发布时间】:2012-02-26 18:42:34
【问题描述】:
 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...所以这个方法会在你创建一个新类后立即启动,它以布尔值作为参数。我不明白为什么您需要说明 userID = ' ' 的事实。难道你不能让它更简单并写: function __constructor($userID) { if ($userID != '') ........等等。 ETC。 ??还是他们的意思是一样的? 声明布尔值的想法对我来说从来没有意义,尤其是当您不在 IF 语句中使用它来测试它的有效性时。

编辑:我犯了一个非常奇怪的失误。对不起,忽略整个布尔值,它甚至不是布尔语句。我的错误... 12 小时的编程学习正在付出代价。

问题2:第5行的变量$userID和第8行的$userID一样吗?我想不,但我不确定。我确定第 5 行的 $userID 与第 12 行和第 15 行的 $this->userID 相同,但是第 8 行和第 10 行呢?我很困惑。如果第 8 行的变量 $userID 不为空,那么您将在第 5 行找到的 $userID 分配给第 8 行 $userID 的 floatval? 我感觉这是 2 个不同的 $userID。如果是这样,为什么这家伙不能用不同的词?哈哈

注意:我学习 PHP 还不到一周,所以这些看起来更像是基本的概念性问题。语法对我来说并不是真正的问题,而是概念。

任何帮助表示赞赏。干杯。

【问题讨论】:

  • 为什么认为它是布尔值?它甚至默认为一个空字符串,那你为什么假设它是一个布尔变量呢??
  • 只是一个旁注,它是__construct() 而不是__constructor()
  • 最好找一个不混合 PHP4 和 PHP5 的教程...一个好的 PHP5 教程会将“可见性”分配给 $perms、$userID 和 $userRoles,而不是简单地使用“var”
  • @Tom,谢谢。这是一个较旧的教程,但我一直在使用 __construct()。
  • @MarkBaker,感谢您指出这一点。我只是用“public”而不是“var”来养成分配“可见性”的习惯,但我肯定在寻找更新的 PHP5 教程。仍然学到很多东西。

标签: php oop boolean


【解决方案1】:

好的,

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

【讨论】:

  • 啊,是的,这就是我所说的“创建一个新课程”的意思。我的意思是使用类 ACL 并实例化它并“制作”该类的新对象。我的滑倒在那里。回复您的答案:1)OOOOOOOHHHHHH。我现在明白了。想要给它一个默认值,并且能够调用 APC() 或 new APC("userID").. 非常清楚。谢谢你。 2)感谢您清除它。这让我想问,使用相同的“名称”是否被认为是不好的编码习惯,例如在这种情况下,编码器将对象属性和函数参数都设为同一件事?还是很常见?
  • 我知道在构造函数非常小的情况下(即只设置变量,不采取任何进一步的行动),我通常使用同名变量。在事情可能变得粘稠的情况下。我对参数和属性使用不同的名称。
【解决方案2】:

它不是布尔值。它是默认值。因此,如果您调用不带参数的函数,它会将$userId 视为""

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

【讨论】:

  • 哇,我觉得自己很笨。我要睡觉了。我把它读成布尔值,甚至没有把它读成分配给空字符串的变量。
【解决方案3】:

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

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


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

【讨论】:

  • 谢谢,我在问题 1 上犯了一个错误。关于问题 2,因此可以肯定地说,第 5/12/15 行的用户 ID 是相同的,而第 10/12 行的用户 ID 只存在在函数内部,是别的东西。将其重命名为 $abcdef 就可以了,不会有问题吗?他们都被称为 userID 的事实让我很困惑。
  • 第 5 行中的 $userID 只有在使用 $this->userID 时才能从函数内部访问。函数中称为 $userID 的所有内容您都可以重命名为您想要的任何内容,并且不会影响任何内容
  • 感谢 Stratton,现在说得通了。
【解决方案4】:

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

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

请注意:这段代码真的很旧(var 关键字,everthing is public 等)

【讨论】:

  • 谢谢彼得。这是我能找到的唯一一个使用完整解释和源代码完成整个登录系统的教程,但它是从 2008 年或 2009 年开始的。我不确定哪些元素需要更改为私有或受保护,因为 var 与 public 相同.但我想我得改天再学。感谢您解决问题 2。
【解决方案5】:

1.

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

helloWorld()
// prints Hello World

helloWorld("kthxbai")
// prints kthxbai

2.

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

line10=line8

$this 是 ACL 类的当前(从内部)副本(实例)。

他没有使用不同的词,因为这个想法是为了传达您在 new ACL() 中 () 之间放置的任何内容都将成为 ACL 副本(实例)中的 $this->userID。

【讨论】:

  • 谢谢,该睡觉了!关于他为什么使用同一个词的好消息,我不知道。
猜你喜欢
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2016-11-22
  • 2015-12-01
  • 1970-01-01
  • 2015-07-30
相关资源
最近更新 更多