Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP在PHP中设置变量时对其进行操作_Php_Class - Fatal编程技术网

PHP在PHP中设置变量时对其进行操作

PHP在PHP中设置变量时对其进行操作,php,class,Php,Class,这可能看起来是个愚蠢的问题。但是,我有一个类,其中定义了一些public字符串变量 将值指定给特性时: $a = new user(); $a->FirstName = "sth"; 我想将值存储为UTF8 我知道我可以通过以下方式做到这一点: $a->Firstname = utf8_encode("sth"); 但是,我希望对象自动执行此操作 我该怎么做呢?如果您将类设计为具有访问器和变异器,而不是对原始变量的公共访问,那么这将很容易 原始代码: class user {

这可能看起来是个愚蠢的问题。但是,我有一个类,其中定义了一些
public
字符串变量

将值指定给特性时:

$a = new user();
$a->FirstName = "sth";
我想将值存储为UTF8

我知道我可以通过以下方式做到这一点:

$a->Firstname = utf8_encode("sth");
但是,我希望对象自动执行此操作


我该怎么做呢?

如果您将类设计为具有访问器和变异器,而不是对原始变量的公共访问,那么这将很容易

原始代码:

class user {
   private $FirstName = '';

   public function getFirstName() {
      return $this->FirstName;
   }
}
解决方案代码:

class user {
   private $FirstName = '';

   public function getFirstName() {
      return utf8_encode($this->FirstName);
   }
}
我建议朝着这个方向发展

否则,对象无法自动执行此操作


编辑

\uuu set
\uu get
可能是实现这一点最合适的方法。我对它们不太熟悉,也没什么关系:我在这里要说的是使用访问器和变异器。。。然而,您最终实现了它们。

您希望使用setter和getter。见:

比如:

使用魔术方法的示例:

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;
  }
}
编辑:我正在使用
$data
,这样至少可以控制可以设置哪些属性

否则,对象无法自动执行此操作

不是自动的,但是


那么,这与uu set()是不可能的吗??我到处都读到这些只用于未定义的变量。@Eskach:
\uu set
也可以。实际上可能更好(尽管我不熟悉)。这里的重点是使用访问器和变异器,但是您可以这样做。@Eskach参见第二个示例。希望能有帮助。而且我真的不喜欢这种方法。既不是公共属性,也不是获取和设置属性的神奇方法。但这只是我的观点。也许我没有弄清楚,但你在硬编码这个字符串,对吗?那么只需将.php文件保存在UTF8中就足够了。您确定知道
UTF8\u encode
的作用吗?它非常明确地将ISO-8859-1字符串转换为UTF-8。您如何保证要存储在此对象中的所有字符串都是ISO-8859-1编码的?顺便问一下,您能详细说明一下我如何使用它吗?就像我说的:
$a->FirstName=“sth”??@ ESKACH,而这将短期工作,您可能需要考虑重构到一个更封装的版本。从长远来看,这将节省您的时间。@Eskach用一个小的使用示例更新了此内容。它的工作原理是将public类成员更改为private,并且在调用$user->Firstname时会调用u set()。并且,请告诉我当类中的函数尝试为属性赋值时会发生什么情况?__集是否也被称为?@Eskach No,_集仅在变量为私有且不可写时才会被调用。私有变量可以从类本身中写入,这意味着它将直接写入,而不是通过_集进行代理。
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;
  }
}
<?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;