2017-08-07 1 views
1

Je suis en train de charger automatiquement un espace de noms avec un tas de fonctions d'aide:un espace de noms tout le chargement automatique en php (pour les fonctions à la place d'une classe)

<?php 

namespace App\Str { 
    function contains($haystack, $needles) 
    { 
     foreach ((array)$needles as $needle) { 
      if ($needle !== '' && mb_strpos($haystack, $needle) !== false) { 
       return true; 
      } 
     } 
     return false; 
    } 

    function starts_with($haystack, $needles) 
    { 
     foreach ((array) $needles as $needle) { 
      if ($needle !== '' && substr($haystack, 0, strlen($needle)) === (string) $needle) { 
       return true; 
      } 
     } 
     return false; 
    } 
} 

compositeur-Rsp 4 autoloading ne permet pas ici:

Call to undefined function App\Str\starts_with() 

Je comprends sais que je ne peux pas (paresseusement) fonctions autoload, et je donne des conseils pour faire une classe avec des fonctions statiques, mais comme je préfère la programmation fonctionnelle, je veux d'abord étudier d'autres options . Par exemple, est-ce que je pourrais charger (paresseusement) tout l'espace de noms lui-même? Je veux utiliser cet espace de noms de la manière suivante:

use App\Str as Str; 

$test = Str\starts_with('test', 't'); 

Je veux préciser en quelque sorte au compositeur, que si elle voit l'espace de noms App\Str, il doit paresseusement exiger le fichier app/Str.php, pas vraiment comment fonctionne le compositeur, mais Est-ce que quelque chose comme ça ne serait pas possible?

+1

Si vous n'êtes pas à l'aise avec les classes et préférez la programmation fonctionnelle, pourquoi ne pas utiliser une classe comme un wrapper et mettre toutes vos fonctions en tant que fonctions * statiques * à l'intérieur de cette classe. Si vous le faites, vous n'aurez pas besoin d'instancier de nouveaux objets de cette classe pour utiliser ses fonctions. Vous pouvez juste faire 'ClassName :: myFunction()' parce que le code fonctionnel sera difficile à maintenir plus tard à mesure que votre code grandit. –

Répondre

2

Malheureusement, ce n'est pas possible. Si vous voulez autoloading non paresseux que vous devez ajouter à votre composer.json:

"autoload": { 
    "files": [ 
     "app/Str.php", 
     "app/Arr.php" 
    ] 
} 

où chaque entrée est un nom de fichier avec vos fonctions.