yii源码分析4——非核心类的导入注册,yii源码_PHP教程
yii源码分析4——非核心类的导入注册,yii源码
转载请注明: TheViper http://www.cnblogs.com/TheViper
在yii源码分析1中说到spl_autoload_register注册给定的函数作为 __autoload 的实现,在这里是autoload().
<span>public</span> <span>static</span> <span>function</span> autoload(<span>$className</span><span>) { </span><span>include</span> self::<span>$_coreClasses</span> [<span>$className</span><span>]; }</span>
实际上这个autoload()是没有考虑非核心文件的引入的。比如,在app文件夹经常会有自定义的一些重要文件夹,比如'application.utils.*(工具类),'application.filters.*'(过滤类),'application.validators.*'(校验类)等。
在实际用的时候,是不用一个一个include的,直接new就可以了,yii已经帮我们做了include的工作。而这个工作就是在autoload()里面做的。
上面的代码很显然没有考虑非核心文件的引入,这是我的疏忽。
那yii是怎么帮我们引入非核心文件的?
这要从CApplication说起。
<span>abstract</span> <span>class</span> CApplication <span>extends</span><span> CModule { </span><span>public</span> <span>function</span> __construct(<span>$config</span> = <span>null</span><span>) { </span><span>if</span> (<span>is_string</span> ( <span>$config</span><span> )) </span><span>$config</span> = <span>require</span> (<span>$config</span><span>); Yii</span>::setApplication ( <span>$this</span> );<span>//</span><span>保存整个app实例</span> <span>if</span> (<span>isset</span> ( <span>$config</span> ['basePath'<span>] )) { </span><span>$this</span>->setBasePath ( <span>$config</span> ['basePath'<span>] ); </span><span>unset</span> ( <span>$config</span> ['basePath'<span>] ); } </span><span>else</span> <span>$this</span>->setBasePath ( 'protected'<span> ); </span><span>//</span><span>设置别名,后面就可以用application表示basePath了</span> Yii::setPathOfAlias ( 'application', <span>$this</span>-><span>getBasePath () ); </span><span>//</span><span>钩子,模块 预 初始化时执行,子类实现。不过这时,配置还没有写入框架</span> <span>$this</span>-><span>preinit (); </span><span>$this</span>-><span>registerCoreComponents (); </span><span>//</span><span>父类实现</span> <span>$this</span>->configure ( <span>$config</span><span> ); </span><span>//</span><span>加载静态应用组件</span> <span>$this</span>-><span>preloadComponents (); </span><span>//</span><span>这才开始初始化模块</span> <span>$this</span>-><span>init (); }</span>
注意到里面的$this->configure ( $config );,$config是传入的配置文件,是一个数组,非核心文件的定义就是在这里面,比如引入工具类文件夹
<?<span>php </span><span>return</span> <span>array</span><span> ( </span>'basePath' => <span>dirname</span> ( <span>__FILE__</span> ) . DIRECTORY_SEPARATOR . '..', 'import' => <span>array</span><span> ( </span>'application.utils.*'<span> ) ); </span>?>
然后在父类CModule
<span>public</span> <span>function</span> configure(<span>$config</span><span>) { </span><span>if</span> (<span>is_array</span> ( <span>$config</span><span> )) { </span><span>foreach</span> ( <span>$config</span> <span>as</span> <span>$key</span> => <span>$value</span><span> ) </span><span>$this</span>-><span>$key</span> = <span>$value</span><span>; } }</span>
这里yii很"狡猾",它在CModule的父类CComponent中重写了__set()
<span>public</span> <span>function</span> __set(<span>$name</span>,<span>$value</span><span>) { </span><span>$setter</span>='set'.<span>$name</span><span>; </span><span>if</span>(<span>method_exists</span>(<span>$this</span>,<span>$setter</span><span>)) </span><span>return</span> <span>$this</span>-><span>$setter</span>(<span>$value</span><span>); </span><span>else</span>....<span> }</span>
可以看到,如果CModule中如果有设置yii指定参数(比如import)的方法,就会调用它,而我之前裁剪的时候,把CModule中的setImport()删掉了。
另外可以看到basePath, params, modules, import, components 是yii保留的参数名。
<span>public</span> <span>function</span> setImport(<span>$aliases</span><span>) { </span><span>foreach</span>(<span>$aliases</span> <span>as</span> <span>$alias</span><span>) Yii</span>::import(<span>$alias</span><span>); }</span>
然后是YiiBase里面的import()
<span>public</span> <span>static</span> <span>function</span> import(<span>$alias</span>, <span>$forceInclude</span> = <span>false</span><span>) { </span><span>if</span> (<span>isset</span> ( self::<span>$_imports</span> [<span>$alias</span>] )) <span>//</span><span>是否已经存在路径</span> <span>return</span> self::<span>$_imports</span> [<span>$alias</span><span>]; </span><span>if</span> (<span>class_exists</span> ( <span>$alias</span>, <span>false</span> ) || <span>interface_exists</span> ( <span>$alias</span>, <span>false</span> ))<span>//</span><span>类是否已经定义,针对如urlManager这样的已定义于$_coreClasses[]的类</span> <span>return</span> self::<span>$_imports</span> [<span>$alias</span>] = <span>$alias</span><span>; </span><span>if</span> ((<span>$pos</span> = <span>strrpos</span> ( <span>$alias</span>, '.' )) === <span>false</span>) <span>//</span><span>直接是文件名</span> <span> { </span><span>//</span><span> try to autoload the class with an autoloader if $forceInclude is true</span> <span>if</span> (<span>$forceInclude</span> && (Yii::autoload ( <span>$alias</span>, <span>true</span> ) || <span>class_exists</span> ( <span>$alias</span>, <span>true</span><span> ))) self</span>::<span>$_imports</span> [<span>$alias</span>] = <span>$alias</span><span>; </span><span>return</span> <span>$alias</span><span>; } </span><span>$className</span> = ( <span>string</span> ) <span>substr</span> ( <span>$alias</span>, <span>$pos</span> + 1<span> ); </span><span>$isClass</span> = <span>$className</span> !== '*'<span>; </span><span>//</span><span>是否为路径+类名</span> <span>if</span> (<span>$isClass</span> && (<span>class_exists</span> ( <span>$className</span>, <span>false</span> ) || <span>interface_exists</span> ( <span>$className</span>, <span>false</span><span> ))) </span><span>return</span> self::<span>$_imports</span> [<span>$alias</span>] = <span>$className</span><span>; </span><span>//</span><span>获取真实路径</span> <span>if</span> ((<span>$path</span> = self::getPathOfAlias ( <span>$alias</span> )) !== <span>false</span><span>) { </span><span>//</span><span>是否以*结尾,如application.utils.*</span> <span>if</span> (<span>$isClass</span><span>) { </span><span>if</span> (<span>$forceInclude</span><span>) { </span><span>if</span> (<span>is_file</span> ( <span>$path</span> . '.php'<span> )) </span><span>require</span> (<span>$path</span> . '.php'<span>); </span><span>else</span> <span>throw</span> <span>new</span> CException ( Yii::t ( 'yii', 'Alias "{alias}" is invalid. Make sure it points to an existing PHP file and the file is readable.', <span>array</span><span> ( </span>'{alias}' => <span>$alias</span><span> ) ) ); self</span>::<span>$_imports</span> [<span>$alias</span>] = <span>$className</span><span>; } </span><span>else</span><span> self</span>::<span>$classMap</span> [<span>$className</span>] = <span>$path</span> . '.php'<span>; </span><span>return</span> <span>$className</span><span>; } </span><span>else</span> <span>//</span><span> a directory</span> <span> { </span><span>if</span> (self::<span>$_includePaths</span> === <span>null</span><span>) { self</span>::<span>$_includePaths</span> = <span>array_unique</span> ( <span>explode</span> ( PATH_SEPARATOR, <span>get_include_path</span><span> () ) ); </span><span>if</span> ((<span>$pos</span> = <span>array_search</span> ( '.', self::<span>$_includePaths</span>, <span>true</span> )) !== <span>false</span><span>) </span><span>unset</span> ( self::<span>$_includePaths</span> [<span>$pos</span><span>] ); } </span><span>array_unshift</span> ( self::<span>$_includePaths</span>, <span>$path</span><span> ); </span><span>if</span> (self::<span>$enableIncludePath</span> && <span>set_include_path</span> ( '.' . PATH_SEPARATOR . <span>implode</span> ( PATH_SEPARATOR, self::<span>$_includePaths</span> ) ) === <span>false</span><span>) self</span>::<span>$enableIncludePath</span> = <span>false</span><span>; </span><span>return</span> self::<span>$_imports</span> [<span>$alias</span>] = <span>$path</span><span>; } } }</span>
一系列的判断,最后走到最后的else,将path写入到$_imports,这时仍然没有include.
include在autoload()
<span>public</span> <span>static</span> <span>function</span> autoload(<span>$className</span><span>) { </span><span>//</span><span> use include so that the error PHP file may appear</span> <span>if</span>(<span>isset</span>(self::<span>$classMap</span>[<span>$className</span><span>])) </span><span>include</span>(self::<span>$classMap</span>[<span>$className</span><span>]); </span><span>elseif</span>(<span>isset</span>(self::<span>$_coreClasses</span>[<span>$className</span><span>])) </span><span>include</span>(self::<span>$_coreClasses</span>[<span>$className</span><span>]); </span><span>else</span><span> { </span><span>//</span><span> include class file relying on include_path</span> <span>if</span>(<span>strpos</span>(<span>$className</span>,'\\')===<span>false</span>) <span>//</span><span> class without namespace</span> <span> { </span><span>if</span>(self::<span>$enableIncludePath</span>===<span>false</span><span>) { </span><span>foreach</span>(self::<span>$_includePaths</span> <span>as</span> <span>$path</span><span>) { </span><span>$classFile</span>=<span>$path</span>.DIRECTORY_SEPARATOR.<span>$className</span>.'.php'<span>; </span><span>if</span>(<span>is_file</span>(<span>$classFile</span><span>)) { </span><span>include</span>(<span>$classFile</span><span>); </span><span>break</span><span>; } } } </span><span>else</span> <span>include</span>(<span>$className</span>.'.php'<span>); } </span><span>return</span> <span>class_exists</span>(<span>$className</span>,<span>false</span>) || <span>interface_exists</span>(<span>$className</span>,<span>false</span><span>); } </span><span>return</span> <span>true</span><span>; }</span>
如果需要include的是非核心文件,那这里的$className只是一个alias,即文件名的前缀。
裁剪的yii http://files.cnblogs.com/TheViper/framework.zip
如果您觉得本文的内容对您有所帮助,您可以打赏我:

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

En tant que plate-forme intégrant les réseaux sociaux et le commerce électronique, Xiaohongshu a attiré de plus en plus d'utilisateurs. Certains utilisateurs espèrent enregistrer plusieurs comptes pour une meilleure expérience d'interaction avec Xiaohongshu. Alors, comment enregistrer plusieurs comptes sur Xiaohongshu ? 1. Comment enregistrer plusieurs comptes sur Xiaohongshu ? 1. Utilisez différents numéros de téléphone mobile pour vous inscrire Actuellement, Xiaohongshu utilise principalement des numéros de téléphone mobile pour enregistrer des comptes. Les utilisateurs essaient parfois d'acheter plusieurs cartes de numéro de téléphone mobile et de les utiliser pour enregistrer plusieurs comptes Xiaohongshu. Cependant, cette approche présente certaines limites, car l’achat de plusieurs cartes de numéro de téléphone mobile est fastidieux et coûteux. 2. Utilisez l'e-mail pour vous inscrire En plus de votre numéro de téléphone mobile, votre e-mail peut également être utilisée pour enregistrer un compte Xiaohongshu. Les utilisateurs peuvent préparer plusieurs adresses e-mail, puis utiliser ces adresses e-mail pour enregistrer des comptes. mais

Xiaohongshu, plateforme sociale intégrant vie, divertissement, shopping et partage, est devenue un élément indispensable du quotidien de nombreux jeunes. Alors, comment créer un compte Xiaohongshu ? 1. Comment créer un compte Xiaohongshu ? 1. Ouvrez le site officiel de Xiaohongshu ou téléchargez l'application Xiaohongshu. Cliquez sur le bouton « S'inscrire » ci-dessous et vous pourrez choisir différentes méthodes d'inscription. Actuellement, Xiaohongshu prend en charge l'enregistrement avec des numéros de téléphone mobile, des adresses e-mail et des comptes tiers (tels que WeChat, QQ, Weibo, etc.). 3. Remplissez les informations pertinentes. Selon la méthode d'inscription sélectionnée, renseignez le numéro de téléphone mobile, l'adresse e-mail ou les informations de compte tiers correspondants. 4. Définissez un mot de passe. Définissez un mot de passe fort pour sécuriser votre compte. 5. Terminez la vérification. Suivez les invites pour terminer la vérification du téléphone mobile ou la vérification de l'e-mail. 6. Perfectionner l’individu

En tant que l'une des plateformes de partage de style de vie les plus populaires au monde, Xiaohongshu a attiré un grand nombre d'utilisateurs. Alors, comment créer un compte Xiaohongshu ? Cet article vous présentera en détail le processus d'enregistrement du compte Xiaohongshu et répondra à la question de savoir comment récupérer les anomalies du compte Xiaohongshu. 1. Comment créer un compte Xiaohongshu ? 1. Téléchargez l'application Xiaohongshu : recherchez et téléchargez l'application Xiaohongshu dans la boutique d'applications mobiles, et ouvrez-la une fois l'installation terminée. 2. Enregistrez un compte : après avoir ouvert l'application Xiaohongshu, cliquez sur le bouton « Moi » dans le coin inférieur droit de la page d'accueil, puis sélectionnez « S'inscrire ». 3. Remplissez les informations d'enregistrement : Remplissez le numéro de téléphone mobile, définissez le mot de passe, le code de vérification et d'autres informations d'enregistrement selon les invites. 4. Complétez les informations personnelles : après une inscription réussie, suivez les instructions pour compléter les informations personnelles, telles que le nom, le sexe, la date de naissance, etc. 5. Paramètres

qooapp est un logiciel qui peut télécharger de nombreux jeux, alors comment créer un compte ? Les utilisateurs doivent cliquer sur le bouton « S'inscrire » s'ils n'ont pas encore de pass, puis choisir une méthode d'inscription. Cette introduction à la méthode d'enregistrement de compte est suffisante pour vous expliquer comment la faire fonctionner. Ce qui suit est une introduction détaillée, alors jetez-y un œil. Comment créer un compte qooapp ? Réponse : Cliquez pour vous inscrire, puis choisissez une méthode d'inscription. Méthodes spécifiques : 1. Après avoir accédé à l'interface de connexion, cliquez ci-dessous. Vous n'avez pas encore de pass ? 2. Choisissez ensuite la méthode de connexion dont vous avez besoin. 3. Vous pouvez l’utiliser directement après. Inscription sur le site officiel : 1. Ouvrez le site Web https://apps.ppaooq.com/ et cliquez sur le coin supérieur droit pour vous inscrire. 2. Sélectionnez l'inscription

Lorsque nous utilisons cette plateforme pour écouter des chansons, la plupart d'entre elles devraient contenir des chansons que vous souhaitez écouter. Bien sûr, certaines choses peuvent ne pas être écoutées car il n'y a pas de droit d'auteur. Bien sûr, nous pouvons également utiliser directement certaines chansons. importé localement. Allez-y pour pouvoir écouter. Nous pouvons télécharger certaines chansons et les convertir directement au format mp3, afin qu'elles puissent être numérisées sur le téléphone mobile pour l'importation et d'autres situations. Cependant, pour la plupart des utilisateurs, ils ne savent pas grand-chose sur l'importation de contenu de chansons locales, donc afin de bien résoudre ces problèmes, aujourd'hui l'éditeur vous l'expliquera également. La méthode de contenu vous permet de faire de meilleurs choix sans vous demander si. tu es intéressé,

Bilibili (Bilibili), en tant que site de partage de vidéos très populaire auprès de la jeunesse chinoise, a attiré un grand nombre d'utilisateurs. Certains utilisateurs espèrent disposer de deux comptes Bilibili afin de pouvoir les gérer et les utiliser séparément. Alors, comment enregistrer deux numéros de site B avec un seul numéro de téléphone mobile ? Cet article se concentrera sur ce problème et sur la manière de dissocier le téléphone mobile. 1. Comment enregistrer deux numéros de site B avec un seul numéro de téléphone mobile ? 1. Enregistrez un nouveau compte : Tout d'abord, ouvrez l'application Bilibili sur votre téléphone mobile ou connectez-vous au site officiel, cliquez sur le bouton « S'inscrire » et sélectionnez la méthode d'enregistrement. Vous pouvez utiliser votre numéro de téléphone mobile, votre e-mail ou un tiers. compte de parti (tel que WeChat, QQ, etc.) pour vous inscrire. 2. Lors de la création d'un compte, veuillez remplir les informations nécessaires selon les invites du système, y compris le numéro de téléphone portable, le code de vérification et le mot de passe défini. Assurez-vous d'utiliser des comptes différents

WeChat est un logiciel social populaire doté de fonctions riches et de nombreux utilisateurs. Si vous souhaitez vérifier depuis combien de temps vous êtes inscrit sur WeChat, bien que WeChat lui-même ne fournisse pas directement la fonction de vérification de l'heure d'inscription, nous pouvons spéculer via certaines méthodes indirectes. Cependant, ces méthodes ne sont pas absolument précises car divers facteurs peuvent affecter l’exactitude des résultats. Si vous avez des exigences précises concernant l'heure d'inscription, il est recommandé de contacter le service client WeChat pour consultation. Comment vérifier combien de temps s'est écoulé depuis l'enregistrement sur WeChat ? La première façon de savoir depuis combien de temps vous êtes inscrit sur WeChat est de vérifier votre boîte aux lettres QQ. Si vous utilisez QQ pour vous connecter à WeChat, après une inscription réussie, votre boîte aux lettres QQ recevra un e-mail de bienvenue de WeChat. Vous pouvez rechercher « WeChat » dans votre boîte aux lettres QQ pour voir s'il existe un tel e-mail, puis déterminer l'heure d'inscription. La deuxième façon est de regarder

Avec le lancement des comptes vidéo WeChat, de plus en plus de personnes ont vu de nouvelles opportunités de trafic. Par conséquent, l'enregistrement d'un compte matriciel de compte vidéo est devenu la priorité de nombreux créateurs et commerçants. Alors, comment enregistrer un compte matriciel de numéros vidéo ? Comment créer votre propre compte vidéo ? Cet article répondra en détail à ces deux questions. 1. Comment enregistrer un compte matriciel de numéros vidéo ? 1. Compte WeChat : Tout d’abord, vous devez disposer d’un compte WeChat. Si ce n'est pas le cas, veuillez d'abord en enregistrer un. 2. Ouvrez un compte vidéo : dans l'application WeChat, recherchez la page « Découvrir » et cliquez sur « Compte vidéo » pour accéder à la page du compte vidéo. 3. Centre des créateurs : au bas de la page du compte vidéo, cliquez sur le bouton "Centre des créateurs" pour accéder au Centre des créateurs. 4. Enregistrez un compte vidéo : sur la page Creator Center, recherchez l'option "Enregistrer un compte vidéo".
