试图从类外部调用受保护的函数


Trying to call a protected function from outside the class

好。我是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);
    }
?>

INDEX.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);
    }
?>

您不能这样做,因为方法设置为protected,您必须将其设置为public才能访问它。否则,您只能从同一类或该类的子类调用它。

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

您还使用了一个变量$db,该变量没有在类的任何位置定义。

另外,请不要对新代码使用mysql_*函数。它们不再被维护,社区已经开始了贬低过程。是否看到红框?相反,您应该了解准备好的语句,并使用PDO或MySQLi。如果你不能决定,这篇文章将有助于你的选择。如果你想学习,这里有一个很好的PDO教程。

这也将修复您代码中存在的令人讨厌的SQL注入有关如何使用PDO或mysqli修复此问题的更多信息,请参阅此问题。

在将数据插入数据库时,您似乎也在使用网站作为密码。如果你真的要存储数据库,我还建议你为了安全起见,仔细阅读哈希密码。

我建议您重新阅读有关可见性的文档。

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

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

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

所以,如果你想像以前那样调用,就要公开你的函数

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

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

这应该会有所帮助:

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

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

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

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

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

在构造中初始化。。