【问题标题】:Trying to call a protected function from outside the class试图从类外部调用受保护的函数
【发布时间】:2012-08-28 15:44:42
【问题描述】:

好的。我是 PHP 中的类的新手,并试图将变量传递给类中的受保护函数。我该怎么做?

CLASSES.PHP

<?php
    include($_SERVER['DOCUMENT_ROOT']."/includes/con.php");

    class gindex {
        protected function rdev($a,$b,$c,$d){
            $d = base64_encode($d);
            mysql_query("INSERT INTO mem(first_name,last_name,email,password,type) VALUES(".$a.",".$b.",".$c.",".$d.",'developer')", $db);
    }
?>

索引.PHP

<?php
    include($_SERVER['DOCUMENT_ROOT']."/includes/con.php");
    if(isset($_POST['developerbtn'])){
        $fname = $_REQUEST['fname'];
        $lname = $_REQUEST['lname'];
        $email = $_REQUEST['email'];
        $password = $_REQUEST['password'];
        $Cgindex = new gindex();
        $Cgindex->rdev($fname,$lname,$email,$password);
    }
?>

【问题讨论】:

标签: php class function protected


【解决方案1】:

我建议您再次阅读visibility 上的文档。

声明为受保护的成员只能在类本身内以及被继承的类和父类访问。

$Cgindex-&gt;rdev(... 从全局上下文调用,而不是在允许的类上下文中。

【讨论】:

    【解决方案2】:

    你不能,受保护函数的目的是只能从类内部或继承的类中调用

    如果你想像以前那样调用它,请公开你的函数:

    public function rdev($a,$b,$c,$d){
    

    【讨论】:

      【解决方案3】:

      您需要大致了解 OOP。
      受保护的函数是......保护类外部使用。意味着:只有类或子类的方法内部的代码才能调用受保护的方法。此外,持有受保护方法的类的所有子类都将继承该方法。

      【讨论】:

        【解决方案4】:

        受保护的元素只能从已定义的同一类及其子类中访问,而不能从外部访问。

        【讨论】:

          【解决方案5】:

          您不能这样做,因为该方法设置为protected,您必须将其设置为public 才能使用to access it。否则,您只能从同一个班级或该班级的孩子中调用它。

          我还建议你的类名以大写开头:class Gindex。您可能还想改进类的名称,因为gindex 没有说明它的作用。您的method 名称也是如此。而且您的参数名称也很糟糕。正确命名事物,以便人们(包括)您自己在(重新)查看您的代码时确切地知道变量包含/类或方法的作用。

          您还使用了一个变量$db,它没有在the scope of the class 的任何地方定义。

          另外,请不要将mysql_* 函数用于新代码。它们不再被维护,社区已经开始deprecation process。看到red box?相反,您应该了解prepared statements 并使用PDOMySQLi。如果您不能决定,this article 将帮助您选择。如果你想学习,here is a good PDO tutorial

          这也将修复代码中的讨厌的SQL Injection有关如何使用 PDO 或 mysqli 修复此问题的更多信息,请参阅 this question

          在将数据插入数据库时​​,您似乎也在使用网站作为密码。如果您真的要存储数据库,我还建议您阅读hashing the password 以确保安全。

          【讨论】:

          • 感谢您的帮助。我决定一起使用 JQuery/AJAX 和 PHP。
          【解决方案6】:

          这应该会有所帮助:

          Public — 类的任何用户都可以直接访问公共变量或方法。

          Protected — 受保护的变量或方法不能被该类的用户访问,但可以在从该类继承的子类中访问。

          Private — 私有变量或方法只能从定义它的类内部访问。这意味着不能从扩展该类的子类调用私有变量或方法。

          【讨论】:

            【解决方案7】:

            function __construct(){
            		$this->rdev();
            	}

            在构造中初始化..

            【讨论】:

              猜你喜欢
              • 2010-11-02
              • 2015-07-18
              • 2011-03-19
              • 1970-01-01
              • 2014-11-03
              • 2016-03-26
              • 2017-12-12
              • 2015-08-26
              • 1970-01-01
              相关资源
              最近更新 更多