Wordpress 4.6
[autoinstalls/wordpress.git] / wp-includes / class-wp-widget-factory.php
index 12b45532331c8e89b0463b4047a32f490992b4fd..061625816e3004151591cc57cfdf58f053811f64 100644 (file)
@@ -45,28 +45,84 @@ class WP_Widget_Factory {
                self::__construct();
        }
 
+       /**
+        * Memory for the number of times unique class instances have been hashed.
+        *
+        * This can be eliminated in favor of straight spl_object_hash() when 5.3
+        * is the minimum requirement for PHP.
+        *
+        * @since 4.6.0
+        * @access private
+        * @var array
+        *
+        * @see WP_Widget_Factory::hash_object()
+        */
+       private $hashed_class_counts = array();
+
+       /**
+        * Hashes an object, doing fallback of `spl_object_hash()` if not available.
+        *
+        * This can be eliminated in favor of straight spl_object_hash() when 5.3
+        * is the minimum requirement for PHP.
+        *
+        * @since 4.6.0
+        * @access private
+        *
+        * @param WP_Widget $widget Widget.
+        * @return string Object hash.
+        */
+       private function hash_object( $widget ) {
+               if ( function_exists( 'spl_object_hash' ) ) {
+                       return spl_object_hash( $widget );
+               } else {
+                       $class_name = get_class( $widget );
+                       $hash = $class_name;
+                       if ( ! isset( $widget->_wp_widget_factory_hash_id ) ) {
+                               if ( ! isset( $this->hashed_class_counts[ $class_name ] ) ) {
+                                       $this->hashed_class_counts[ $class_name ] = 0;
+                               }
+                               $this->hashed_class_counts[ $class_name ] += 1;
+                               $widget->_wp_widget_factory_hash_id = $this->hashed_class_counts[ $class_name ];
+                       }
+                       $hash .= ':' . $widget->_wp_widget_factory_hash_id;
+                       return $hash;
+               }
+       }
+
        /**
         * Registers a widget subclass.
         *
         * @since 2.8.0
+        * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object
+        *              instead of simply a `WP_Widget` subclass name.
         * @access public
         *
-        * @param string $widget_class The name of a WP_Widget subclass.
+        * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass.
         */
-       public function register( $widget_class ) {
-               $this->widgets[$widget_class] = new $widget_class();
+       public function register( $widget ) {
+               if ( $widget instanceof WP_Widget ) {
+                       $this->widgets[ $this->hash_object( $widget ) ] = $widget;
+               } else {
+                       $this->widgets[ $widget ] = new $widget();
+               }
        }
 
        /**
         * Un-registers a widget subclass.
         *
         * @since 2.8.0
+        * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object
+        *              instead of simply a `WP_Widget` subclass name.
         * @access public
         *
-        * @param string $widget_class The name of a WP_Widget subclass.
+        * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass.
         */
-       public function unregister( $widget_class ) {
-               unset( $this->widgets[ $widget_class ] );
+       public function unregister( $widget ) {
+               if ( $widget instanceof WP_Widget ) {
+                       unset( $this->widgets[ $this->hash_object( $widget ) ] );
+               } else {
+                       unset( $this->widgets[ $widget ] );
+               }
        }
 
        /**