yii2源码学习笔记(十三),yii2源码学习笔记
yii2源码学习笔记(十三),yii2源码学习笔记
模型类DynamicModel主要用于实现模型内的数据验证yii2\base\DynamicModel.php
<span> 1</span> <?<span>php </span><span> 2</span> <span>/*</span><span>* </span><span> 3</span> <span> * @link </span><span>http://www.yiiframework.com/</span> <span> 4</span> <span> * @copyright Copyright (c) 2008 Yii Software LLC </span><span> 5</span> <span> * @license </span><span>http://www.yiiframework.com/license/</span> <span> 6</span> <span>*/</span> <span> 7</span> <span>namespace</span> yii\<span>base</span><span>; </span><span> 8</span> <span> 9</span> <span>use yii\validators\Validator; </span><span> 10</span> <span> 11</span> <span>/*</span><span>* </span><span> 12</span> <span> * DynamicModel is a model class primarily used to support ad hoc data validation. </span><span> 13</span> <span> * DynamicModel是一种主要用于支持ad hoc数据验证模型类 </span><span> 14</span> <span> * The typical usage of DynamicModel is as follows, </span><span> 15</span> <span> * </span><span> 16</span> <span> * ```php </span><span> 17</span> <span> * public function actionSearch($name, $email) </span><span> 18</span> <span> * { </span><span> 19</span> <span> * $model = DynamicModel::validateData(compact('name', 'email'), [ </span><span> 20</span> <span> * [['name', 'email'], 'string', 'max' => 128], </span><span> 21</span> <span> * ['email', 'email'], </span><span> 22</span> <span> * ]); </span><span> 23</span> <span> * if ($model->hasErrors()) { </span><span> 24</span> <span> * // validation fails </span><span> 25</span> <span> * } else { </span><span> 26</span> <span> * // validation succeeds </span><span> 27</span> <span> * } </span><span> 28</span> <span> * } </span><span> 29</span> <span> * ``` </span><span> 30</span> <span> * </span><span> 31</span> <span> * The above example shows how to validate `$name` and `$email` with the help of DynamicModel. </span><span> 32</span> <span> * 上面的例子演示了如何用DynamicModel验证用户名`$name`和邮箱`$email` </span><span> 33</span> <span> * The [[validateData()]] method creates an instance of DynamicModel, defines the attributes </span><span> 34</span> <span> * using the given data (`name` and `email` in this example), and then calls [[Model::validate()]]. </span><span> 35</span> <span> * validateData() 方法会创建一个 DynamicModel 的实例对象。通过给定数据定义模型特性,之后调用Model::validate() 方法。 </span><span> 36</span> <span> * You can check the validation result by [[hasErrors()]], like you do with a normal model. </span><span> 37</span> <span> * You may also access the dynamic attributes defined through the model instance, e.g., </span><span> 38</span> <span> * 可以通过[[hasErrors()]]方法获取验证结果 </span><span> 39</span> <span> * `$model->name` and `$model->email`. </span><span> 40</span> <span> * </span><span> 41</span> <span> * Alternatively, you may use the following more "classic" syntax to perform ad-hoc data validation: </span><span> 42</span> <span> * 除此之外,你也可以用如下的更加“classic(传统)”的语法来执行临时数据验 </span><span> 43</span> <span> * ```php </span><span> 44</span> <span> * $model = new DynamicModel(compact('name', 'email')); </span><span> 45</span> <span> * $model->addRule(['name', 'email'], 'string', ['max' => 128]) </span><span> 46</span> <span> * ->addRule('email', 'email') </span><span> 47</span> <span> * ->validate(); </span><span> 48</span> <span> * ``` </span><span> 49</span> <span> * </span><span> 50</span> <span> * DynamicModel implements the above ad-hoc data validation feature by supporting the so-called </span><span> 51</span> <span> * "dynamic attributes". It basically allows an attribute to be defined dynamically through its constructor </span><span> 52</span> <span> * or [[defineAttribute()]]. </span><span> 53</span> <span> * 实现了上述特殊数据模型验证功能支持的“动态属性”。允许通过它的构造函数或 [[defineAttribute()]]来定义一个属性 </span><span> 54</span> <span> * @author Qiang Xue <qiang.xue@gmail.com> </span><span> 55</span> <span> * @since 2.0 </span><span> 56</span> <span>*/</span> <span> 57</span> <span>class</span><span> DynamicModel extends Model </span><span> 58</span> <span>{ </span><span> 59</span> <span>private</span> $_attributes = [];<span>//</span><span>动态模型内动态属性</span> <span> 60</span> <span> 61</span> <span> 62</span> <span>/*</span><span>* </span><span> 63</span> <span> * Constructors.构造函数,用于将传入的属性赋值给_attributes,便于使用 </span><span> 64</span> <span> * @param array $attributes the dynamic attributes (name-value pairs, or names) being defined被定义的动态属性 </span><span> 65</span> <span> * @param array $config the configuration array to be applied to this object.用于该对象的配置数组。 </span><span> 66</span> <span>*/</span> <span> 67</span> <span>public</span> function __construct(array $attributes = [], $config =<span> []) </span><span> 68</span> <span> { </span><span> 69</span> <span>foreach</span> ($attributes <span>as</span> $name => $value) {<span>//</span><span>遍历传入的属性</span> <span> 70</span> <span>if</span> (is_integer($name)) {<span>//</span><span>如果是整型,说明只传入了属性名,将属性名写入_attributes</span> <span> 71</span> $<span>this</span>->_attributes[$value] = <span>null</span><span>; </span><span> 72</span> } <span>else</span><span> { </span><span> 73</span> $<span>this</span>->_attributes[$name] = $value;<span>//</span><span>按键值对的形式写入</span> <span> 74</span> <span> } </span><span> 75</span> <span> } </span><span> 76</span> parent::__construct($config);<span>//</span><span>调用父类的配置</span> <span> 77</span> <span> } </span><span> 78</span> <span> 79</span> <span>/*</span><span>* </span><span> 80</span> <span> * @inheritdoc 重写__get方法,从_attributes中取值 </span><span> 81</span> <span>*/</span> <span> 82</span> <span>public</span><span> function __get($name) </span><span> 83</span> <span> { </span><span> 84</span> <span>if</span> (array_key_exists($name, $<span>this</span>-><span>_attributes)) { </span><span> 85</span> <span>//</span><span>如果传入的$name在数组_attributes中存在,则从_attributes中取值</span> <span> 86</span> <span>return</span> $<span>this</span>-><span>_attributes[$name]; </span><span> 87</span> } <span>else</span> {<span>//</span><span>否则调用父类的__get方法取属性值</span> <span> 88</span> <span>return</span><span> parent::__get($name); </span><span> 89</span> <span> } </span><span> 90</span> <span> } </span><span> 91</span> <span> 92</span> <span>/*</span><span>* </span><span> 93</span> <span> * @inheritdoc 重写__set方法,给_attributes设置值 </span><span> 94</span> <span>*/</span> <span> 95</span> <span>public</span><span> function __set($name, $value) </span><span> 96</span> <span> { </span><span> 97</span> <span>if</span> (array_key_exists($name, $<span>this</span>-><span>_attributes)) { </span><span> 98</span> <span>//</span><span>如果传入的$name在数组_attributes中存在,则将动态属性$name的值设置为$value</span> <span> 99</span> $<span>this</span>->_attributes[$name] =<span> $value; </span><span>100</span> } <span>else</span><span> { </span><span>101</span> parent::__set($name, $value);<span>//</span><span>调用父类的__set方法设置属性值</span> <span>102</span> <span> } </span><span>103</span> <span> } </span><span>104</span> <span>105</span> <span>/*</span><span>* </span><span>106</span> <span> * @inheritdoc 同上 重写__isset方法,判断_attributes中是否设置$name值 </span><span>107</span> <span>*/</span> <span>108</span> <span>public</span><span> function __isset($name) </span><span>109</span> <span> { </span><span>110</span> <span>if</span> (array_key_exists($name, $<span>this</span>-><span>_attributes)) { </span><span>111</span> <span>return</span> isset($<span>this</span>-><span>_attributes[$name]); </span><span>112</span> } <span>else</span><span> { </span><span>113</span> <span>return</span><span> parent::__isset($name); </span><span>114</span> <span> } </span><span>115</span> <span> } </span><span>116</span> <span>117</span> <span>/*</span><span>* </span><span>118</span> <span> * @inheritdoc 同上,重写__unset方法,删除_attributes中的$name属性值 </span><span>119</span> <span>*/</span> <span>120</span> <span>public</span><span> function __unset($name) </span><span>121</span> <span> { </span><span>122</span> <span>if</span> (array_key_exists($name, $<span>this</span>-><span>_attributes)) { </span><span>123</span> unset($<span>this</span>-><span>_attributes[$name]); </span><span>124</span> } <span>else</span><span> { </span><span>125</span> <span> parent::__unset($name); </span><span>126</span> <span> } </span><span>127</span> <span> } </span><span>128</span> <span>129</span> <span>/*</span><span>* </span><span>130</span> <span> * Defines an attribute. 定义动态属性的方法 </span><span>131</span> <span> * @param string $name the attribute name 属性名 </span><span>132</span> <span> * @param mixed $value the attribute value 属性值 </span><span>133</span> <span>*/</span> <span>134</span> <span>public</span> function defineAttribute($name, $value = <span>null</span><span>) </span><span>135</span> <span> { </span><span>136</span> $<span>this</span>->_attributes[$name] =<span> $value; </span><span>137</span> <span> } </span><span>138</span> <span>139</span> <span>/*</span><span>* </span><span>140</span> <span> * Undefines an attribute. 用于删除动态属性的方法 </span><span>141</span> <span> * @param string $name the attribute name 属性名 </span><span>142</span> <span>*/</span> <span>143</span> <span>public</span><span> function undefineAttribute($name) </span><span>144</span> <span> { </span><span>145</span> unset($<span>this</span>-><span>_attributes[$name]); </span><span>146</span> <span> } </span><span>147</span> <span>148</span> <span>/*</span><span>* </span><span>149</span> <span> * Adds a validation rule to this model. 添加验证规则 </span><span>150</span> <span> * You can also directly manipulate [[validators]] to add or remove validation rules. </span><span>151</span> <span> * This method provides a shortcut. </span><span>152</span> <span> * 可以直接调用[[validators]]来添加或者删除验证规则,本方法提供了一个短方法 </span><span>153</span> <span> * @param string|array $attributes the attribute(s) to be validated by the rule 进行验证的属性 </span><span>154</span> <span> * @param mixed $validator the validator for the rule.This can be a built-in validator name, </span><span>155</span> <span> * a method name of the model class, an anonymous function, or a validator class name. </span><span>156</span> <span> * 规则的验证。这是一个内置验证器的名字, 一个模型类的方法名,一个匿名函数或一个验证器类的名称。 </span><span>157</span> <span> * @param array $options the options (name-value pairs) to be applied to the validator </span><span>158</span> <span> * (name-value)被应用到验证器 </span><span>159</span> <span> * @return static the model itself 模型本身 </span><span>160</span> <span>*/</span> <span>161</span> <span>public</span> function addRule($attributes, $validator, $options =<span> []) </span><span>162</span> <span> { </span><span>163</span> $validators = $<span>this</span>->getValidators();<span>//</span><span>所有的验证规则对象 </span><span>164</span> <span>//</span><span>生成Validator对象,并且插入 $validators中</span> <span>165</span> $validators->append(Validator::createValidator($validator, $<span>this</span><span>, (array) $attributes, $options)); </span><span>166</span> <span>167</span> <span>return</span> $<span>this</span><span>; </span><span>168</span> <span> } </span><span>169</span> <span>170</span> <span>/*</span><span>* </span><span>171</span> <span> * Validates the given data with the specified validation rules.通过指定的规则验证给定的数据 </span><span>172</span> <span> * This method will create a DynamicModel instance, populate it with the data to be validated, </span><span>173</span> <span> * create the specified validation rules, and then validate the data using these rules. </span><span>174</span> <span> * @param array $data the data (name-value pairs) to be validated </span><span>175</span> <span> * @param array $rules the validation rules. Please refer to [[Model::rules()]] on the format of this parameter. </span><span>176</span> <span> * @return static the model instance that contains the data being validated </span><span>177</span> <span> * @throws InvalidConfigException if a validation rule is not specified correctly. </span><span>178</span> <span>*/</span> <span>179</span> <span>public</span> <span>static</span> function validateData(array $data, $rules =<span> []) </span><span>180</span> <span> { </span><span>181</span> <span>/*</span><span> @var $model DynamicModel </span><span>*/</span> <span>182</span> $model = <span>new</span> <span>static</span>($data);<span>//</span><span>实例化调用类,将$data赋值给_attributes</span> <span>183</span> <span>if</span> (!<span>empty($rules)) { </span><span>184</span> $validators = $model->getValidators();<span>//</span><span>获取所有定义的验证规则</span> <span>185</span> <span>foreach</span> ($rules <span>as</span><span> $rule) { </span><span>186</span> <span>if</span><span> ($rule instanceof Validator) { </span><span>187</span> $validators->append($rule);<span>//</span><span>如果$rule是Validator的实例,则添加到$validators中</span> <span>188</span> } elseif (is_array($rule) && isset($rule[<span>0</span>], $rule[<span>1</span>])) { <span>//</span><span> attributes, validator type </span><span>189</span> <span>//</span><span>如果$rule是数组,则判断动态属性和验证类型是否存在,创建Validator对象,添加到$validators中</span> <span>190</span> $validator = Validator::createValidator($rule[<span>1</span>], $model, (array) $rule[<span>0</span>], array_slice($rule, <span>2</span><span>)); </span><span>191</span> $validators-><span>append($validator); </span><span>192</span> } <span>else</span> {<span>//</span><span>抛出异常</span> <span>193</span> <span>throw</span> <span>new</span> InvalidConfigException(<span>'</span><span>Invalid validation rule: a rule must specify both attribute names and validator type.</span><span>'</span><span>); </span><span>194</span> <span> } </span><span>195</span> <span> } </span><span>196</span> <span> } </span><span>197</span> <span>198</span> $model->validate();<span>//</span><span>执行验证</span> <span>199</span> <span>200</span> <span>return</span><span> $model; </span><span>201</span> <span> } </span><span>202</span> <span>203</span> <span>/*</span><span>* </span><span>204</span> <span> * @inheritdoc 返回所有的动态属性 </span><span>205</span> <span>*/</span> <span>206</span> <span>public</span><span> function attributes() </span><span>207</span> <span> { </span><span>208</span> <span>return</span> array_keys($<span>this</span>-><span>_attributes); </span><span>209</span> <span> } </span><span>210</span> }

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

想象一下,一个人工智能模型,不仅拥有超越传统计算的能力,还能以更低的成本实现更高效的性能。这不是科幻,DeepSeek-V2[1],全球最强开源MoE模型来了。DeepSeek-V2是一个强大的专家混合(MoE)语言模型,具有训练经济、推理高效的特点。它由236B个参数组成,其中21B个参数用于激活每个标记。与DeepSeek67B相比,DeepSeek-V2性能更强,同时节省了42.5%的训练成本,减少了93.3%的KV缓存,最大生成吞吐量提高到5.76倍。DeepSeek是一家探索通用人工智

AI,的确正在改变数学。最近,一直十分关注这个议题的陶哲轩,转发了最近一期的《美国数学学会通报》(BulletinoftheAmericanMathematicalSociety)。围绕「机器会改变数学吗?」这个话题,众多数学家发表了自己的观点,全程火花四射,内容硬核,精彩纷呈。作者阵容强大,包括菲尔兹奖得主AkshayVenkatesh、华裔数学家郑乐隽、纽大计算机科学家ErnestDavis等多位业界知名学者。AI的世界已经发生了天翻地覆的变化,要知道,其中很多文章是在一年前提交的,而在这一

谷歌力推的JAX在最近的基准测试中性能已经超过Pytorch和TensorFlow,7项指标排名第一。而且测试并不是在JAX性能表现最好的TPU上完成的。虽然现在在开发者中,Pytorch依然比Tensorflow更受欢迎。但未来,也许有更多的大模型会基于JAX平台进行训练和运行。模型最近,Keras团队为三个后端(TensorFlow、JAX、PyTorch)与原生PyTorch实现以及搭配TensorFlow的Keras2进行了基准测试。首先,他们为生成式和非生成式人工智能任务选择了一组主流

波士顿动力Atlas,正式进入电动机器人时代!昨天,液压Atlas刚刚「含泪」退出历史舞台,今天波士顿动力就宣布:电动Atlas上岗。看来,在商用人形机器人领域,波士顿动力是下定决心要和特斯拉硬刚一把了。新视频放出后,短短十几小时内,就已经有一百多万观看。旧人离去,新角色登场,这是历史的必然。毫无疑问,今年是人形机器人的爆发年。网友锐评:机器人的进步,让今年看起来像人类的开幕式动作、自由度远超人类,但这真不是恐怖片?视频一开始,Atlas平静地躺在地上,看起来应该是仰面朝天。接下来,让人惊掉下巴

本月初,来自MIT等机构的研究者提出了一种非常有潜力的MLP替代方法——KAN。KAN在准确性和可解释性方面表现优于MLP。而且它能以非常少的参数量胜过以更大参数量运行的MLP。比如,作者表示,他们用KAN以更小的网络和更高的自动化程度重现了DeepMind的结果。具体来说,DeepMind的MLP有大约300,000个参数,而KAN只有约200个参数。KAN与MLP一样具有强大的数学基础,MLP基于通用逼近定理,而KAN基于Kolmogorov-Arnold表示定理。如下图所示,KAN在边上具

特斯拉机器人Optimus最新视频出炉,已经可以在厂子里打工了。正常速度下,它分拣电池(特斯拉的4680电池)是这样的:官方还放出了20倍速下的样子——在小小的“工位”上,拣啊拣啊拣:这次放出的视频亮点之一在于Optimus在厂子里完成这项工作,是完全自主的,全程没有人为的干预。并且在Optimus的视角之下,它还可以把放歪了的电池重新捡起来放置,主打一个自动纠错:对于Optimus的手,英伟达科学家JimFan给出了高度的评价:Optimus的手是全球五指机器人里最灵巧的之一。它的手不仅有触觉

目标检测在自动驾驶系统当中是一个比较成熟的问题,其中行人检测是最早得以部署算法之一。在多数论文当中已经进行了非常全面的研究。然而,利用鱼眼相机进行环视的距离感知相对来说研究较少。由于径向畸变大,标准的边界框表示在鱼眼相机当中很难实施。为了缓解上述描述,我们探索了扩展边界框、椭圆、通用多边形设计为极坐标/角度表示,并定义一个实例分割mIOU度量来分析这些表示。所提出的具有多边形形状的模型fisheyeDetNet优于其他模型,并同时在用于自动驾驶的Valeo鱼眼相机数据集上实现了49.5%的mAP

写在前面项目链接:https://nianticlabs.github.io/mickey/给定两张图片,可以通过建立图片之间的对应关系来估计它们之间的相机姿态。通常,这些对应关系是二维到二维的,而我们估计的姿态在尺度上是不确定的。一些应用,例如随时随地实现即时增强现实,需要尺度度量的姿态估计,因此它们依赖于外部的深度估计器来恢复尺度。本文提出了MicKey,这是一个关键点匹配流程,能够够预测三维相机空间中的度量对应关系。通过学习跨图像的三维坐标匹配,我们能够在没有深度测试的情况下推断出度量相对
