Eskach
Eskach

Reputation: 13

PHP operating on a variable upon setting it in PHP

This might look as a stupid question. But, I have a class with some public string variables defined in it.

Upon assigning a value to a property:

$a = new user();
$a->FirstName = "sth";

I want to store the value as UTF8.

I know I can do this via:

$a->Firstname = utf8_encode("sth");

However, I want the object to do this automatically.

How can I do this?

Upvotes: 1

Views: 47

Answers (3)

Berry Langerak
Berry Langerak

Reputation: 18859

Otherwise no, the object cannot do it automatically.

Not automatically, but automagically!

<?php

class User {
    /**
     * Change the public to private/protected!
     */
    private $Firstname;

    /**
     * This is automatically called upon calling a value that can't be written "from the outside".
     */
    public function __set( $key, $value ) {
        $this->$key = utf8_encode( $value );
    }

    public function __get( $key ) {
        return isset( $this->$key ) ? $this->$key : false;
    }
}

$user = new User;
$user->Firstname = 'Berry';

echo $user->Firstname;

The better solution would be to refactor in using mutators and accessors, or better yet, learn OO.

Upvotes: 2

Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385174

If you'd designed your class to have accessors and mutators, rather than public access to raw variables, then this would be easy.

Original code:

class user {
   private $FirstName = '';

   public function getFirstName() {
      return $this->FirstName;
   }
}

Solution code:

class user {
   private $FirstName = '';

   public function getFirstName() {
      return utf8_encode($this->FirstName);
   }
}

I suggest moving towards this approach.

Otherwise no, the object cannot do it automatically.


Edit

__set and __get might be the most appropriate way to implement this. I'm not too familiar with them, and it doesn't really matter: the point I'm making here is to use accessors and mutators... however you end up implementing them.

Upvotes: 0

Yoshi
Yoshi

Reputation: 54649

You want to use setters and getters. See: http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29

Like:

class User
{
  protected $Firstname;

  public function setFirstname($Firstname) {
    $this->Firstname = utf8_encode($Firstname);
  }

  public function getFirstname() {
    return $this->Firstname;
  }
}

Example using magic methods:

class User
{
  protected $data = array(
    'Firstname' => '',
    // ...
  );

  public function __set($key, $value) {
    if (isset($this->data[$key])) {
        $this->data[$key] = utf8_encode($value);
    }
  }

  public function __get($key) {
    return isset($this->data[$key]) ? $this->data[$key] : null;
  }
}

Edit: I'm using $data so that there is at least a minimum of control of what properties can be set.

Upvotes: 1

Related Questions