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; } } ?>