PHP类存入数据库时如何过滤不需要的private私有属性
解决方案
以下几个方案都可以解决你的需求,其中修改为类常量的方案最优,从根源避免了实例冗余属性:
- 方案1:将固定不变的
$types改为类常量(最优)
你当前把所有实例共用的固定验证规则写成了实例私有属性,本身就不合理,改为类常量后该值属于类本身,不会被加载到每个实例对象中,自然不会在存储时占用额外空间。
修改后的类代码如下:
class message { public $message; public $type; public $timestamp; // 改为类常量,所有实例共用这一份值 private const TYPES = [null, "success", "danger", "warning", "info", "primary"]; public function __construct(string $message, string $type = "success") { $this->timestamp = time(); // 这里把$this->types改为self::TYPES即可 if(in_array(strtolower($type), self::TYPES)) { $this->type = strtolower($type); } else { $this->type = null; } $this->message = $message; } }
修改后你不管是直接序列化实例还是导出属性都不会带上这个验证规则,完全不影响原有逻辑。
- 方案2:类内新增导出数组的方法
如果不想修改原有属性定义,可以直接在类里加一个公有方法导出你需要的存储字段,需要存数据库时直接调用该方法拿数组即可:
// 在message类里新增这个方法 public function toArray(): array { return [ 'message' => $this->message, 'type' => $this->type, 'timestamp' => $this->timestamp ]; }
调用方式:$msgData = $messageObj->toArray();,直接存这个数组的对应字段到数据库即可。
- 方案3:用
__sleep魔术方法自定义序列化规则
如果你是直接把对象序列化后存入数据库,可以加__sleep方法指定序列化时只保留你需要的三个属性:
// 在message类里新增这个方法 public function __sleep(): array { return ['message', 'type', 'timestamp']; }
序列化对象时会自动过滤掉$types属性,不需要额外操作。
你之前尝试unset私有属性失败是因为私有属性只能在类内部操作,外部无法直接修改/删除,以上方案都在类内部处理,符合类的封装规则。
内容的提问来源于stack exchange,提问作者Chud37
相关产品推荐
相关产品推荐

