phossa2/shared

View on GitHub
src/Shared/Base/ClassNameTrait.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
/**
 * Phossa Project
 *
 * PHP version 5.4
 *
 * @category  Library
 * @package   Phossa2\Shared
 * @copyright Copyright (c) 2016 phossa.com
 * @license   http://mit-license.org/ MIT License
 * @link      http://www.phossa.com/
 */
/*# declare(strict_types=1); */

namespace Phossa2\Shared\Base;

use Phossa2\Shared\Message\Message;

/**
 * ClassNameTrait
 *
 * - Implementation of ClassNameInterface.
 * - Provides PHP 5.5 ::class feature for classes using this trait
 * - methods are final to prevent accidental overriden in child class
 *
 * @package Phossa2\Shared
 * @author  Hong Zhang <phossa@126.com>
 * @version 2.0.0
 * @since   2.0.0 added
 * @since   2.0.24 added setProperties()
 * @since   2.0.29 modified getShortName(), getNamespace() parameters
 */
trait ClassNameTrait
{
    /**
     * Returns fully qualified class name
     *
     * @return string
     * @access public
     * @final
     * @api
     */
    final public static function getClassName()/*# : string */
    {
        return get_called_class();
    }

    /**
     * Returns class name without namespace
     *
     * @param  string|object $className optional classname
     * @return string
     * @access public
     * @since  2.0.29 add $className parameter
     * @final
     * @api
     */
    final public static function getShortName(
        $className = ''
    )/*# : string */ {
        $base = strrchr(static::getRealClassName($className), '\\');
        return $base ? substr($base, 1) : $className;
    }

    /**
     * Returns namespace of current class
     *
     * @param  string|object $className optional classname
     * @return string
     * @access public
     * @since  2.0.29 add $className parameter
     * @final
     * @api
     */
    final public static function getNameSpace(
        /*# string */ $className = ''
    )/*# : string */ {
        $class = static::getRealClassName($className);
        return substr($class, 0, strrpos($class, '\\'));
    }

    /**
     * Set object properties
     *
     * @param  array $properties
     * @access public
     * @since  2.0.24 added
     * @api
     */
    final public function setProperties(array $properties = [])
    {
        foreach ($properties as $name => $value) {
            if (property_exists($this, $name)) {
                $this->$name = $value;
            } else {
                trigger_error(
                    Message::get(
                        Message::MSG_PROPERTY_UNKNOWN,
                        $name,
                        get_class($this)
                    ),
                    E_USER_WARNING
                );
            }
        }
    }

    /**
     * Get the classname
     *
     * @param  string|object $className
     * @return string the class name
     * @access protected
     */
    protected static function getRealClassName($className)/*# : string */
    {
        if (is_object($className)) {
            $class = get_class($className);
        } else {
            $class = $className ?: get_called_class();
        }
        return $class;
    }
}