Rajitha Abeysekara Rajitha Abeysekara -4 years ago 84
HTML Question

Undefined variable: user_created_date in php when using __get Method

I try to create object from a another class and access it from the second class. Object was created and when I print the object from using the first class it will print. But when I use second class and call the getter method and try to print, it will give an error.

When I try to create object of the first class in the second class and try to call the getter method it will give an error of undefined variable

$any_varible
.

First Class:

<?php
namespace pages;
class User {
private static $first_name;
private static $last_name;
private static $nic;
private static $email;
private static $password;
private static $tel;
private static $address;
private static $city;
private static $postal_code;
private static $dob;
private static $food;
private static $pet;
private static $smoke;
private static $chat;
private static $music;
private static $gender;
private static $user_created_date;




public function __construct($first_name,$last_name,$nic,$email,$password,$tel,$address,$city,$postal_code,$dob,$food,$pet,$smoke,$chat,$music,$gender,$user_created_date) {
$this->$first_name=$first_name;
$this->$last_name=$last_name;
$this->$nic=$nic;
$this->$email=$email;
$this->$password=$password;
$this->$tel=$tel;
$this->$address=$address;
$this->$city=$city;
$this->$postal_code=$postal_code;
$this->$dob=$dob;
$this->$food=$food;
$this->$pet=$pet;
$this->$smoke=$smoke;
$this->$chat=$chat;
$this->$music=$music;
$this->$gender=$gender;
$this->$user_created_date=$user_created_date;


}
public function __get($property) {
if (property_exists($this, $property)) {
return $this->$property;
}
}

public function __set($property, $value) {
if (property_exists($this, $property)) {
$this->$property = $value;
}

}


} ?>


<?php
namespace pages;
include '../Model/User.php';
include 'Database.php';
{

$cars = array(0,0,0,0,0);
$availableChoice=$_POST['choice'];
$today=date('Y/m/d');
$count=0;
foreach ($availableChoice as $name){
$cars[$count]=1;
$count++;
}

$usernew=new User($_POST['fName'],$_POST['lName'],$_POST['nic'],$_POST['email'],$_POST['password'],$_POST['mobile'],$_POST['address'],$_POST['city'],$_POST['postalCode'],$_POST['dob'],$cars[0],$cars[1],$cars[2],$cars[3],$cars[4],$_POST['gender'],$today);
//echo $_POST['email'];
//echo $user->$email;
echo $usernew->__get($user_created_date);
/*$newDatabase=new Database();
$connection=$newDatabase->CreateConnection();
$newDatabase->InsertUser($user,$connection);*/


}


?>

Answer Source

Try updating your getters and setters like so:

public function __set($name, $value) {
    $this->data[$name] = $value;
}

public function __get($name) {
    if (array_key_exists($name, $this->data)) {
        return $this->data[$name];
    }
    return null;
}

http://php.net/manual/en/language.oop5.overloading.php#object.get

Actually try this out..

class User { 

    private $data = array();

    public function __construct($data) {
        $this->data = $data;
    }

    public function __set($name, $value) {
        $this->data[$name] = $value;
    }

    public function __get($name) {
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }
        return null;
    }

}

$u = new User($_POST);
echo $u->fName;

You'll have to be sure to add all the data you want to pass to the User class into the $data array..

Your User class should probably be passed an $id though instead of actual data.. Use the $id to pull the data.. Something more like so:

class User { 

    private $data = array();

    public function __construct($id = null) {
        if (!is_null($id) && $id > 0) {
            $this->id = $id;
            $this->data = array(); # query user data..
        } else {
            $this->id = 0;
        }
    }

    public function __set($name, $value) {
        $this->data[$name] = $value;
    }

    public function __get($name) {
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }
        return null;
    }

    public function save() {
        if ($this->id > 0) {
            # UPDATE user data..
        } else {
            # INSERT user data..
        }
    }

}

# add new user (no ID provided)..
$u = new User();
$u->fName = $_POST['fName'];
$u->lName = $_POST['lName'];
$u->save();

# get/update user data (ID provided)..
$u = new User(1);
echo $u->fName; # get
$u->fName = 'NewName'; # update
$u->save();
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download