gubnota/smart_loader

More srightforward way to call pseudostatically without create every time in every new file new class instance

dev-master 2016-10-23 07:50 UTC

This package is not auto-updated.

Last update: 2024-11-05 02:38:10 UTC


README

Gubnota/smart_loader (aka g:: or \Gubnota\Gubnota) is a class- helper to load and reuse class instances. It makes re-using class instances easier throughout all application (no need to re-initialize new instance, each instance stored in global object). Autoload class helper increases drastically perfomance and convenience by reusing instances when calling class methods in pseudo-static way:

<?php
g::Class('method','arg',...); //or
g::instance()->Class->method('arg',...);
?>

You can by-pass variables to the other calee (method) in jQuery-way. By default, g:: stores only one class instace and re-use it when calling the same class from other place. Autoloader can be used two ways: composer pakagist default psr-4 autoloader, and g:: own autoloader. Fully compatible with >= PHP 5.4, PHP 7.0.

Installing by composer

Add gubnota/smart_loader string to your composer.json require section and run composer update:

    "require": {
        "php" : ">=5.4",
        "gubnota/smart_loader": "dev-master"
    },

Alternatively you can download package to include according to your autoloading pattern subsystem.

<?php
include('smart_loader-master/init.php');
?>

Included files

  • test.php - Example of usage
  • g.php - class name shortcode (call g:: rather than Gubnota\Gubnota)
  • Gubnota/Gubnota.php - main class helper that do all the stuff
  • John/Doe.php - class for calling (with only one public method)
  • init.php - include this to autoload

Autoloading classes

If you are not gonna use Composer psr-4 standard autoloading class solution, please don't forget to setup your own:

<?php
include(__DIR__.'/vendor/gubnota/smart_loader/init.php');
?>

You might want to use more advanced usage by adding extra directories to search:

<?php
include(__DIR__.'/vendor/gubnota/smart_loader/Gubnota/Smart_loader.php');
$l = \Gubnota\Smart_loader::instance();
$l->place('name_for_new_place_to_look_for',__DIR__);
spl_autoload_register([$l, 'load']);
?>

When you call smart_autoloader from anywhere of your other places:

Remapping long names

smart_loader also able to remap long class names to the short ones:

<?php
g::instance()->facade('john','John\Doe')->get_instance('john');
?>

See also at Facades section.

Usage

Creating instance of the class for calling only one method:

<?php
$john_doe = new John\Doe(); 
$john_doe->write_message_to('Samuel Smitters');
?>

That usually become a headache: you have to create every time in every new file utilizing class that class method. Old method includes utilize static method or creating the global variable. New apporach included in Laravel 4, for instance, using catching name method to create instance of, save every called instance of the class to special array to re-call it again without recreating. In most cases you only need this appoach.

Below several equal ways to initialize and call same class method with help of Gubnota/Gubnota loder:

<?php
\Gubnota\Gubnota::John('write_message_to', 'Laura Smith', 'Are you still there?');
?>

or:

<?php
\Gubnota\Gubnota::instance()->John->write_message_to('Dude', 'Got message?');
?>

or:

<?php
\Gubnota\Gubnota::instance()->John->write_message_to('Dude II', 'Got message?');
?>

or:

<?php
g::{'John\\Doe'}('write_message_to',
    ['Laura Smith','John Smith','John Marcus','Mark Brown'][rand(0,3)],
    ['How long does it take to reach your house?','How about we meet next Tuesday?','Hello there.','Are you still there?'][rand(0,3)]);
?>

or:

<?php
g::instance()->{'John\\Doe'}->write_message_to(
    ['Laura Smith','John Smith','John Marcus','Mark Brown'][rand(0,3)],
    ['How long does it take to reach your house?','How about we meet next Tuesday?','Hello there.','Are you still there?'][rand(0,3)]);
?>

or:

<?php
$instance = \Gubnota\Gubnota::instance();
$instance->John->write_message_to('Dude III', 'Got message?');
?>

Because individual instances is not creating every tame, it all shares same public porperty with random number in it. Any special case required re-creating another instance can be also done easily utilizing the new keyword:

<?php
print "g::instance()->rand = ".g::instance()->rand."\n";
print "\Gubnota\Gubnota::instance()->rand = ".$instance->rand." equals\n";
print "Creation of new independent pocket of classes:\n";
$instance2 = new \Gubnota\Gubnota();
print "\$instance2->rand = $instance2->rand not equals\n";
print "\Gubnota\Gubnota::instance()->rand = ".$instance->rand." still equals\n";
?>

Facades

For using name with full namespaces rather than write in every file, better to regsiter it with facades mechanism:

<?php
g::instance()
->empty_facade() // empty all facades default name values
->facade('John','John\Doe') // add default one value included with package
->facade('Smith','John\Doe') // facades can share same class among different names
->delete_facade('Smith') // deletes facade name called 'Smith'
;
?>

After you register facade, just call it anywhere like:

<?php
g::instance()
->facade('sw_sendmail','\Swift_SendmailTransport')
->facade('sw_smtp','\Swift_SmtpTransport')
->facade('sw_message','\Swift_Message')
->facade('sw_malier','\Swift_Mailer')
g::sw_message;
?>

Installing with composer

To be able to use within your composer-powered project, you need to install them via composer. Simply add the libraries to your project's composer.json then run php composer.phar install:

{
    "require": {
        "php" : ">=5.4",
        "gubnota/smart_loader": "dev-master"
    }
}

Config and runtime config

Currently the Gubnota\smart_loader or g symlink still lack a lot of config options they should probably accept.

Troubleshooting

If autoloader not works be sure to inlude in composer.json parent project file autoload and config directives like:

<?php
{
    "name": "gubnota/your_personal_project",
    "authors": [
        {
            "name": "Vladislav Muravyev",
            "email": "me@gubnota.ru"
        }
    ],
    "require": {
        "php" : ">=5.4",
    	"gubnota/smart_loader": "dev-master"
    },
    "min-stability":"dev-master",
    "config": {
        "vendor-dir": "./vendor/"
    },
    "autoload": {
        "psr-4": {"": ["app/"]}
    }
}

You can also autoload files explicily, like:

    "autoload": {
        "files": ["Gubnota/Gubnota.php","g.php","John/Doe.php"]
    }