簡體   English   中英

嘗試從類外部調用受保護的函數

[英]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);
    }
?>

索引庫

<?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_*函數用於新代碼。 它們已不再維護,社區已開始棄用過程 看到紅色框了嗎? 相反,您應該了解准備好的語句,並使用PDOMySQLi 如果您不能決定, 本文將有助於選擇。 如果您想學習, 這里有個不錯的PDO教程

這也將修復您的代碼中存在的討厭的SQL注入 有關如何使用PDO或mysqli修復此問題的更多信息,請參見此問題

在將數據插入數據庫時​​,您似乎還以網站作為密碼。 如果您真的要存儲數據庫,我也建議您讀入哈希以確保安全性。

我建議您再次閱讀有關可見性的文檔。

聲明為protected的成員只能在該類內部以及繼承的和父類訪問。

$Cgindex->rdev(...是從全局上下文中調用,而不是在允許的類上下文中。

您不能,僅從類內部或繼承的類中調用受保護函數的目的

因此,請公開您的函數(如果您希望能夠像以前那樣調用它):

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

您通常需要閱讀有關OOP的內容。
受保護的函數...在類使用之外受到保護。 意思是:只有類或子類的方法內部的代碼才能調用受保護的方法。 同樣,擁有受保護方法的類的所有子類都將繼承該方法。

這應該有助於:

Public —公共變量或方法可以由該類的任何用戶直接訪問。

Protected —受保護的變量或方法不能由該類的用戶訪問,但可以在從該類繼承的子類內部訪問。

Private -私有變量或方法只能從定義它的類內部訪問。這意味着不能從擴展該類的子級調用私有變量或方法。

受保護的元素只能從已定義的同一類中訪問,而不能從外部訪問其子類。

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

在構造中初始化

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM