set("");// house
// DwObject; DwInterface : $dwItem->set("");// network
// DwObject, DwCIDR : $dwItem->set("");// Calendar
// DwObject; DwIp : $dwItem->set("");// 4 in 1
// DwObject; DwPort : $dwItem->set("");// rtl editor
// DwObject; DwBakuba : $dwItem->set("");// world
// DwObject; ACtrl : $dwItem->set("");// Point on map
// DwObject; DwApplication : $dwItem->set("");// Calendar
// DwObject; DwControllerManager : $dwItem->set("");// store
// DwObject; DwService : $dwItem->set("");// Business Man
// DwObject; DwServerA : $dwItem->set("");// business man
// DwObject; DwSocketServerMonoThread : $dwItem->set("");// building
// DwObject; DwSocketServer : $dwItem->set("");// multi house
// DwObject; DwSocket : $dwItem->set("");// building
class DwObject
extends \darkphp\serializable\aDwNoSerializable
implements iDwObject {
static private $keys = array();
static private $instanceCreated = array();
private $instanceKey = null;
public function __construct( self $parent ) {
$this->dwObjectRefInstance();
parent::__construct( $parent );
if ( \is_object ( $this->parent )
&& (
$this->parent === $this
|| ( !is_null( $this->parent->instanceKey ) && $this->parent->getInstanceKey() == $this->getInstanceKey() )
)
)
$this->parent = null;
}
private function dwObjectRefInstance() {
if ( ! isset( $this->instanceKey ) || \is_null( $this->instanceKey ) ) {
self::registrerInstance( $this );
//echo "dwObjectRefInstance [{$this}]:{$this->getClassName()}:{$this->instanceKey}/{$cpt}\r\n";
//echo "dwObjectRefInstance:{$cpt}/{$this->getClassName()}:{$this->instanceKey}\r\n";
} else
throw new \Error( "instanceKey ever registered:{$this->instanceKey} !!!!!!!!!!!!!\r\n [ {$this} ]" );
}
public function getInstanceKey() : string {
return $this->instanceKey;
}
public function toString( $withParent = false ) : string {
if ( ! isset( $this->instanceKey ) || \is_null( $this->instanceKey ) )
$objStr= "[!NoInstanceKey/". $this->getClassName()."]";
else
$objStr= $this->getInstanceKey();
return $objStr.( $withParent ? $this->parentToString() : "" );
}
public function __toString() : string {
if ( ! isset( $this->instanceKey ) || \is_null( $this->instanceKey ) )
$objStr= "[!NoInstanceKey/".$this->getClassName()."]";
else
$objStr= $this->getInstanceKey();
//$objStr.= parent::toString();
return $objStr;
}
public function __destruct( ) {
self::unregistrerInstance( $this );
//$this->log->trace( "." );
parent::__destruct();
foreach( $this as $key => $toDestruct )
if ( isset( $this->$key ) ) unset( $this->$key );
}
//*/
public function getClassName( bool $fqcn=null ) : string {
return self::getStaticClassName( $fqcn );
}
public static function getStaticClassName( bool $fqcn=null ) : string {
return $fqcn ?
parent::getStaticClassName( $fqcn ).self::CLASS_SEPARATOR.__CLASS__
: __CLASS__
;
}
private static function registrerInstance( self $dwObject ) {
$className = $dwObject->getClassName();
self::setInstanceKey( $dwObject );
if ( ! isset(self::$instanceCreated[ $className ]) )
self::$instanceCreated[ $className ]=0;
self::$instanceCreated[ $className ]++;
}
private static function setInstanceKey( self $dwObject ) : void {
$className = $dwObject->getClassName();
$startWith = \darkphp\source\DwSource::classNameToTopName( $className );
$size=0;
do $instanceKey = $startWith.( $size <= 0 ? "" : "_".\darkphp\randomizer\DwRandomizer::randomize( $size ) );
while( \in_array( $instanceKey, self::$keys ) && ( $size++ || true ) );
/*
if ( \in_array( $instanceKey ,self::$keys ) )
echo "inside".\PHP_EOL;
if ( \in_array( $instanceKey ,self::$keys,true ) )
echo "inside".\PHP_EOL;
print_r( self::$keys );
//*/
self::$keys[]=$instanceKey;
$dwObject->instanceKey = $instanceKey;
}
private static function removeInstanceKey( self $dwObject ) : bool {
$removed = true;
if ( ( $key = \array_search( $dwObject->instanceKey, self::$keys ) ) === false )
$removed = false;
else
unset( self::$keys[ $key ] );
return $removed;
}
private static function unregistrerInstance( self $dwObject ) {
$iDwLogger = null;
if ( isset( $dwObject->log ) && \is_object( $dwObject->log ) )
$iDwLogger = $dwObject->log;
else
$iDwLogger = \bakuba\kernel\agartha\DwInstall::getLogger();
if ( ! self::removeInstanceKey( $dwObject ) )
$iDwLogger->error( \PHP_EOL."no refrenced instance for: {$dwObject->toString()}".\PHP_EOL );
else {
if ( ! isset( self::$instanceCreated[ $dwObject->getClassName() ] ) )
$iDwLogger->error( \PHP_EOL." no refrenced instance 2 for :{$dwObject->toString()} !!!\r\n" );
else {
self::$instanceCreated[ $dwObject->getClassName() ]--;
//$iDwLogger->trace( "dwObjectUnRefInstance [{$dwObject->getClassName()}]:{self::$instanceCreated[$dwObject->getClassName()]}" );
if ( self::$instanceCreated[ $dwObject->getClassName() ] === 0 )
unset(self::$instanceCreated[ $dwObject->getClassName() ]);
//if (\is_object($dwObject->log) ) $dwObject->log->trace( "destruct:".( $key===false?"not found":"found" ) );
}
//unset( $dwObject->instanceKey );
/*
if ( ! isset( self::$destructIgnoreClass ) || \is_null( self::$destructIgnoreClass ) ) {
self::$destructIgnoreClass = array(
"bakuba\kernel\objects\DwCallBack"
,"bakuba\kernel\time\timer\DwTimer"
,"bakuba\kernel\io\stream\DwStream"
);
}
if ( isset( self::$destructIgnoreClass ) && \is_array( self::$destructIgnoreClass ) )
if ( ( $key = \array_search( $dwObject->getClassName(), self::$destructIgnoreClass ) ) === false )
$iDwLogger->trace( \PHP_EOL." ... __destruct:".$dwObject->getClassName() );
//*/
}
}
static private $destructIgnoreClass = null;
// DwObject::listInstancesCreated
public static function listInstancesCreated() : array {
return self::$instanceCreated;
}
// DwObject::printStats();
public static function printStats() : string {
return \json_encode( self::listInstancesCreated() );
}
private static $limit = 1;
private static $escapeClass = null;
//\darkphp\DwObject::print_r_limit( $var ,true ) : string ;
// deprecated: prefered / printRLevel cause access to protected values....
public static function print_r_limit( $var ,$html = false ,$level = 0 ,$tabs = '' ) : string {
$newline = $html ? "
" : "\n";
if ( is_array($var) ) {
$title = "Array";
} elseif ( is_object($var) ) {
if ( \method_exists( $var, 'toString' ) )
$title = $var->toString();
elseif ( \method_exists( $var, '__toString' ) )
$title = "{$var}";
else
$title = get_class($var)." Object";
} else {
$title = "Unknow:".ucfirst($var);
}
$output = $tabs . $title . "(";
if ( ! empty($var) ) {
$output .= $newline;
if ( is_array( $var ) )
foreach($var as $key => $value) {
if ( ( \is_array( $value ) || \is_object( $value ) ) )
if ( $level <= self::$limit )
$value = self::print_r_limit( $value ,$html ,$level + 1 ,$tabs.self::$deltaTabs );
else
$value = "**MAX LEVEL**";
else
$value = DwString::toStringEx( $value );
$output .= $tabs . "[" . $key . "] => " . $value. $newline;
}
else {
if ( \is_object( $var ) ) {
if ( $level <= self::$limit )
$value = self::print_r_limit( $var ,$html ,$level + 1 ,$tabs.self::$deltaTabs );
else
$value = "**MAX LEVEL**";
} else
$value = DwString::toStringEx( $var );
$value = $value. $newline;
}
}
$output .= $tabs.")";
return $output;
}
//\darkphp\DwObject::printRLevel( $var ) : string ;
private static $deltaTabs = ' ';
public static function printRLevel( $data ,$html = false ,$level = 1 ,$tabs = '' ) : string {
throw new \Exception("no more use reflection class... memory explode");
if ( is_null( self::$escapeClass ) )
self::$escapeClass = array(
"bakuba\\kernel\\extInc\\log4php\\Logger"
,"bakuba\\kernel\\object\\DwKernel"
,"bakuba\\kernel\\agartha\\DwBakuba"
,"bakuba\\kernel\\logger\\DwLoggerLight"
,"bakuba\\kernel\\logger\\DwLogger"
,"bakuba\\kernel\\network\\DwPort"
,"bakuba\\kernel\\network\\DwIp"
,"bakuba\\kernel\\network\\DwInterface"
,"bakuba\\kernel\\io\\DwResources"
,"bakuba\\kernel\\io\\socket\\DwSocket"
);
$newline = $html ? "
" : "\n";
$type = gettype($data);// object, array, int, float, bool
$output = '';
$elements = array();
$recursiveType = array('object', 'array');
$objectName="";
$recurse = false;
// If type is object, try to get properties by Reflection.
if ($type == 'object') {
$recurse = true;
if ( \method_exists( $data, 'toString' ) )
$output = $tabs.$data->toString();
elseif ( \method_exists( $data, '__toString' ) )
$output = $tabs.$data;
else
$output = $tabs.get_class($data) . ' ' . ucfirst($type);
$ref = new \ReflectionObject($data);
$properties = $ref->getProperties();
$cptProp=3;
foreach ($properties as $property) {
$property->setAccessible(true);
$pType = $property->getName();
$objectName=$pType;
if ($property->isProtected()) {
$pType .= ":protected";
} elseif ($property->isPrivate()) {
$pType .= ":private";
//$pType .= ":" . $property->class . ":private";
}
if ($property->isStatic()) {
$pType .= ":static";
}
if ( isset( $data->$objectName ) )
$elements[$pType] = $property->getValue($data);
$property->setAccessible(false);
if ( $cptProp-- <= 0 ) break;
}
} elseif ($type == 'array') {
$recurse = true;
$output = $tabs.ucfirst($type);
$elements = $data;
} else
$output = $tabs.$data;
if ( $recurse ) {
$output .="(";
if ($level == 0 || $level <= self::$limit ) {
//$output .= "\n{$tabs}";
if ( ! empty( $elements ) ) {
foreach ($elements as $key => $element) {
$output .= "\n{$tabs}".self::$deltaTabs."[{$key}] => ";
if (is_object($element) && in_array( get_class($element), self::$escapeClass ) )
$output .= "escapeClass";
else
$output .= in_array(gettype($element), $recursiveType) ?
self::printRLevel($element, true, $html, $level + 1, $tabs.self::$deltaTabs )
: $element
;
}
$output .= "\n{$tabs}";
}
} else
$output .= "**MAX LEVEL**";
$output .=")";
}
return $output;
}
//\darkphp\DwObject::print_r( $var ,$level = 0 ) : string ;
public static function print_r( $var ,$level = 0 ) : string {
//return self::printRLevel( $var ,$level );
return self::print_r_limit( $var ,false ,$level );
}
/*
static function print_r( $var ,$level = 0 ) : string {
return self::printRLevel( $var ,true ,false ,$level );
//return self::print_r_limit( $error ,true ,false ,$level );
}
// deprecated: prefered / printRLevel cause access to protected values....
static function print_r_limit( $var ,$return = false ,$html = false ,$level = 0 ) : string {
return LoggerRendererDefault::print_r_limit( $var ,$return ,$html ,$level );
}
static function printRLevel( $data ,$return = false ,$html = false ,$level = 1 ) : string {
return LoggerRendererDefault::printRLevel( $data ,$return ,$html ,$level );
}
//*/
public static function createInstanceWithoutConstructor( string $class ) {
throw new \Exception(" no more used!");
$instance = null;
//$reflector = new \ReflectionClass($class);
//$properties = $reflector->getProperties();
//$defaults = $reflector->getDefaultProperties();
\darkphp\autoLoad\DwAutoLoad::require_class_once( $class );
if ( class_exists( "\ReflectionClass" ) ) {
$r = new \ReflectionClass( $class );
$instance = $r->newInstanceWithoutConstructor();
} else {
$instance = \unserialize("O:".strlen($class).":\"$class\":0:{}");
}
/*
foreach ($properties as $property){
$name = $property->getName();
if($property->isProtected()){
$name = chr(0) . '*' .chr(0) .$name;
} elseif($property->isPrivate()) {
$name = chr(0) . $class. chr(0).$name;
}
$serealized .= serialize($name);
if(array_key_exists($property->getName(),$defaults) ) {
$serealized .= serialize($defaults[$property->getName()]);
} else {
$serealized .= serialize(null);
}
}
$serealized .="}";
*/
return $instance;
}
public static function test(
\darkphp\logger\iDwLogger $iDwLogger
,\darkphp\serializable\iDwNoSerializable $dwToTest = null
) : \darkphp\serializable\iDwNoSerializable {
try {
if ( \is_null( $dwToTest ) ) {
$dwToTest = new self();
$dwToTest->setDebug( $iDwLogger );
}
$iDwLogger->info( $dwToTest );
$iDwLogger->info( self::listInstancesCreated() );
} catch( \Exception $exception ) {
$iDwLogger->error( "\r\n\t{$exception}" );
} catch( \Error $error ) {
$iDwLogger->error( "\r\n\t{$error}" );
}
return $dwToTest;
}
}
?>