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

时间:2012-09-04 01:31:32

标签: php class function protected

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

7 个答案:

答案 0 :(得分:4)

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

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

您还使用了the scope of the class中未定义的变量$db

另外请不要将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以确保安全。

答案 1 :(得分:3)

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

  

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

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

答案 2 :(得分:1)

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

所以,如果你想像以前一样打电话给你的功能,那就公开你的功能:

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

答案 3 :(得分:1)

您需要了解一般的OOP 受保护的功能在类使用之外受到保护。意思是:只有类或子类的方法内的代码才能调用受保护的方法。此外,持有受保护方法的类的所有子类都将继承该方法。

答案 4 :(得分:1)

这应该有所帮助:

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

Protected - 类的用户无法访问受保护的变量或方法,但可以在继承自类的子类中访问。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

在Construct中初始化..