ClassAutoLoader

GemVit

Новичок
Sender
Не, это всё понятно :)
Я же говорю про "дать возможность".
Может же быть, что не хочу или не могу я проставить права на запись, т.е. чтобы скрипт мог создавать файлы. При этом прекрасно понимаю для чего необходимо кэширование и чем отключение черевато.
Ладно, спорить не буду. Хозяин - барин. Если буду использовать, то сам модифицирую ;)
 

Sender

Новичок
GemVit
лучше застрелиться чем использовать это без кеша...
тут да, лучше модифицировать самому уже...
 

Wicked

Новичок
я в паттернах не силен... долго смотрел на пример синглтона в мануале, не пойму, как он поможет избавиться от global
в мануале не очень хорошие примеры.
А избавиться от global можно многими способами. Например, храня объект в static-переменной метода, или static-свойстве класса, который и возвращать при обращении.
Вот пример из книги php|architect's Guide to PHP Design Patterns:
PHP:
class DbConn {
  /**
   * static property to hold singleton instance
   */
  static $instance = false;

  /**
   * constructor
   * private so only getInstance() method can instantiate
   * @return void
   */
  private function __construct() {}

  /**
   * factory method to return the singleton instance
   * @return DbConn
   */
  public function getInstance() {
    if (!DbConn::$instance) {
      DbConn::$instance = new DbConn;
    }
    return DbConn::$instance;
  }
}
 

Sender

Новичок
Wicked
теперь понял как это поможет... попозже попробую, только я бы в конструктор еще добавил
private function __construct() { $this->instance = $this; }
 

Scud

Новичок
У меня приблизительно похожий автолоадер работает так:
- сначала указываются дирректории в которых могут лежать классы:
Код:
$loader->addClassPath($absPath);
- а затем все почти как у тебя, за одним исключением. В одном файле должен быть один класс. Имена классов формируются на основе положения файла с реализацией в файловой системе относительно $absPath.Такое решение позволяет избавится от конфликтов имён (почти).
 

Sender

Новичок
Wicked
StUV
не нравится мне синглтон показаный Wicked, начинаются непонятки если я хочу параметры в конструктор передавать,
что скажете насчет этого?
PHP:
	static $instance = false;

	function __construct( $ClassDirectory = array(), $CacheFile = 'autoloader_cache.txt' )
	{
		self::$instance = $this;
...
	}

	function getInstance()
	{
		return self::$instance;
	}
или лучше тогда из констуктора выносить код?

-~{}~ 19.01.07 16:22:

Scud
а если вдруг файлы в другую директорию? или класс перенести из одного файла в другой? приходится переименовывать классы, а следом и код... лично мне было бы неудобно...
 

Sender

Новичок
StUV
в смысле как использовать будет? просто, как обычно... сначала создаем один раз new, а потом уже берем getInstance


а потом из getInstance в констуктор параметры передавать?

а если я параметры хочу передать один раз, а в getInstance потом просто хочу просто объект брать? в getInstance все необязательные параметры делать?
 

StUV

Rotaredom
Scud
+1
у меня практически так (почти так =)):
$pathToFile === str_replace('_', '/', $classname) '.class.php'
и меня вполне устраивает
 

Shturm

Гигант мысли
Sender
просто, как обычно... сначала создаем один раз new, а потом уже берем getInstance....
а если я параметры хочу передать один раз, а в getInstance потом просто хочу просто объект брать? в getInstance все необязательные параметры делать?
PHP:
static $instance = false;

    protected function __construct( $params=array() )
    {
        //do something...
        
    }

    public static function getInstance()
    {
        if( !self::$instance ) self::$instance = new Autoloader( func_get_args() );
        return self::$instance;
    }
 

Sender

Новичок
StUV
Shturm
Последняя версия с синглтонами
http://phpclub.ru/paste/1624


заодно написал класс Singlton, который мне нравится, достаточно extend сделать с этого класса
PHP:
class Singlton
{
	static $instance = false;
	function getInstance()
	{
		if( !self::$instance )
		{
			$Reflection = new ReflectionClass( __CLASS__  );
			$fargs = func_get_args();
			self::$instance = call_user_func_array( array(&$Reflection, 'newInstance'), $fargs );
		}
		return self::$instance;
	}
}
-~{}~ 19.01.07 21:25:

в Singlton'е ошибка, надо __CLASS__ заменить на имя класса к которому он extend'ится...

-~{}~ 19.01.07 21:42:

есть у кого мысли как это реализовать?

-~{}~ 19.01.07 22:06:

рррр... еще static нельзя выносить в Singltone класс...

-~{}~ 19.01.07 22:14:

в общем вот как я синглтон реализовал... к сожалению вместо extends Singlton при дется копированием заниматься при создании нового класса-Singlton'а
PHP:
class MyClass
{
	/** singlton */
	static $instance = false;
	function getInstance()
	{
		if( !self::$instance )
		{
			$Reflection = new ReflectionClass( __CLASS__ );
			$fargs = func_get_args();
			self::$instance = call_user_func_array( array(&$Reflection, 'newInstance'), $fargs );
		}
		return self::$instance;
	}
	function __construct( $a, $b ){}
}
 

Shturm

Гигант мысли
Sender
http://phpclub.ru/paste/index.php?show=1625

PHP:
class SomeClass extends Singletone{ ... }
$Instance = SomeClass::getInstance( "Someclass" );
что-то типа того.
Правда там можно убрать много функционала, который для твоих целей не нужен.
...
Функционал этот добавляет возможность обрабатывать аргументы, переданные
в Class::getInstance() при последующих вызовах.
 

Sender

Новичок
Shturm
была такая мысль, передавать имя класса в getInstance, но мне это показалось удобным...
 
Сверху