PHP 设计模式之最全面,最简单的讲解

2023-05-16

1.单例模式

单例模式是指只创建一个资源(对象、数据库链接等),防止外部实例+判断是否有返回或创建后返回对象。

三个要点:

1.需要一个保存类的唯一实例的静态成员变量
2.构造函数和克隆函数必须声明为私有的,防止外部程序new类从而失去单例模式的意义
3.必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用

优点:

1.单例模式减少资源浪费,保证整个环境只有一个实例对象,特别适合编写资源连接类

代码:

#代码:
	class RedisServer
	{
	    #创建一个静态变量 保存类的唯一实例的静态成员变量
	    private static $instance=[];
	    private $redis;
	    private $host='127.0.0.1';#ip
	    private $post=6379;#端口号
	    private $timeout=0;#闲置时间后关闭
	    private $table=0;#指定哪个库
	    private $connect=1;# 1 长连接 0 短连接
	    //私有的构造方法,禁止外部使用new创建对象 走完这里 3再走方法
	    #指定 ip 端口 这两个是基本不会变的 但是 库的会变 所以根据库的不同 可以new 不同的对象
	    private function __construct($config){
	        $this->redis = new Redis();
	        if(isset($config['host']))  $this->host = $config['host'];
	        if(isset($config['post']))  $this->post = $config['post'];
	        if(isset($config['timeout']))  $this->timeout = $config['timeout'];
	        if(isset($config['table']))  $this->table = $config['table'];
	        if(isset($config['connect']))  $this->connect = $config['connect']>=1 ?1:0;
	
	        # 连接
	        if($this->connect){
	            $this->redis->pconnect($this->host,$this->post,$this->timeout);
	        }else{
	            $this->redis->connect($this->host,$this->post,$this->timeout);
	        }
	
	        if($this->table>15 || $this->table<0 || !is_int($this->table) ){
	            echo '数据库表只能填写0~15的整数';
	            exit;
	        }
	        #选择库
	        $this->redis->select($config['table']);
	    }
	    #1先走这里
	    public static function getInstance($config=[]){
	        $table = array_key_exists('table',$config) ?$config['table']:0;
	        #为啥这里的私有变量 需要加数组呢 如果不加的话 他已经存在了 但他指定的表可能不是你所需要的 就会存在bug
	        if(!isset(self::$instance[$table])){
	            # 这里创建一个对象 赋值给变量
	            echo '重新新建一个表为'.$table.'的对象!';
	            self::$instance[$table] = new self($config);//2然后再走 __construct
	        }
	
	        return self::$instance[$table];
	    }
	    //私有的克隆函数 将克隆方法设为私有,禁止外部克隆对象
	    private function __clone(){}
	    # 4 方法
	        
	        public function close(){
	            return $this->redis->close();
	        }
	        public function getString($str){
	           return $this->redis->get($str);
	        }
	        public function setString($key,$value){
	            return $this->redis->set($key,$value);
	        }
	
	}
	
	$config =[
	    'host'=>'127.0.0.1',#ip
	    'post'=>'6379',#端口号
	    'timeout'=>'0',#闲置时间后关闭
	    'table'=>1,#指定哪个库
	    'connect'=>0,# 1 长连接 0 短连接
	];
	$config1 =[
	    'host'=>'127.0.0.1',#ip
	    'post'=>'6379',#端口号
	    'timeout'=>'0',#闲置时间后关闭
	    'table'=>2,#指定哪个库
	    'connect'=>0,# 1 长连接 0 短连接
	];
	$Server = RedisServer::getInstance($config);
	$Server1 = RedisServer::getInstance($config1);

2.工厂模式

工厂模式其实是一种类,它具有创建对象的某些方法。我们可以使用工厂类来创建对象,而不直接使用 new。这样做的好处是,如果你想要更改所实例化的类名,则只需更改该工厂方法内容即可,不需要逐一寻找代码中具体实例化的地方来修改了。为系统结构提供灵活的动态扩展机制,减少了耦合。

优点:

帮助封装:简单工厂虽然简单,但是非常友好地帮助我们实现了组件的封装,然后让组件外部能真正面向接口编程。
解耦 :通过简单工厂,实现了客户端和具体实现类的解耦。

缺点:

可能增加客户端的复杂度。

工厂模式其实可以划分为:简单工厂模式、工厂方法模式、抽象工厂模式等。

1.简单工厂模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。一般用在具体产品很少扩展的情况下,不用经常修改,且不修改代码的话是不能实现扩展的。

例子:去商店卖手机 一个是苹果厂商提供的手机 一个是小米厂商提供的手机。

#简单工厂模式
	#定义一个接口 手机类商品 等电子产品
	interface Mobile
	{
	    #手机
	    public function mobile();
	    #充电器
	    public function charger();
	}

	#苹果手机厂商
	class Iphone_Mobile implements Mobile {
	    public function __construct()
	    {
	        echo '苹果旗舰店:';
	    }
	    public function mobile(){
	        echo '手机;';
	    }
	    public function charger(){
	        echo '充电器;';
	    }
	}
	#小米手机厂商
	class XiaoMI_Mobile implements Mobile {
	    public function __construct()
	    {
	        echo '小米旗舰店:';
	    }
	    public function mobile(){
	        echo '手机;';
	    }
	    public function charger(){
	        echo '充电器;';
	    }
	}
	# 商店
	class Shopping
	{
	    public static function create($class){
	        switch ($class)
	        {
	            case 'Iphone_Mobile':
	                return new Iphone_Mobile();#选择苹果厂商的商品
	                break;
	            case 'XiaoMI_Mobile':
	                return new XiaoMI_Mobile();#选择小米厂商的商品
	            default: echo '不好意思,我这里没有 '.$class.' 这个手机卖!';
	        }
	    }
	}
	#商店 下单买苹果手机
	$Iphone = Shopping::create('Iphone_Mobile');#苹果旗舰手机店:
	$Iphone->mobile();#买苹果手机:;
	$Iphone->charger();#买苹果充电器:;
	#商店 下单买小米手机
	$XiaoMI = Shopping::create('XiaoMI_Mobile');#小米旗舰店:
	$XiaoMI->mobile();#买小米手机:;
	$XiaoMI->charger();#买小米充电器:;
	#商店 下单买华为手机
	$HUAWEI = Shopping::create('HUAWEI_Mobile');#不好意思,我这里没有 HUAWEI_Mobile 这个手机卖!

2.工厂方法模式

例子:去店铺买手机。发现只有苹果的柜台和小米的柜台。而且柜台只有手机和充电器买。

通过定义了一个抽象出来的核心工厂类,并同时定义创建产品对象的接口,而创建具体实例的工作延迟到工厂子类中去完成


#工厂模式方法
	#定义一个接口 手机类商品 等电子产品
	interface Mobile
	{
	    #手机
	    public function mobile();
	    #充电器
	    public function charger();
	}

	#苹果手机厂商
	class Iphone_Mobile implements Mobile {
	    public function __construct()
	    {
	        echo '苹果手机:';
	    }
	    public function mobile(){
	        echo '手机;';
	    }
	    public function charger(){
	        echo '充电器;';
	    }
	}
	#小米手机厂商
	class XiaoMI_Mobile implements Mobile {
	    public function __construct()
	    {
	        echo '小米手机:';
	    }
	    public function mobile(){
	        echo '手机;';
	    }
	    public function charger(){
	        echo '充电器;';
	    }
	}
	
	#区别
		#定义一个抽象类
		#淘宝
		abstract class Taobao{
			abstract static function shop();# 开店 
		}
		
		# 苹果手机的厂家在淘宝开店
		class Iphone function extends Taobao{
			
			public static function shop(){
				return new Iphone_Mobile();#卖的是自己的苹果手机
			} 
		}
		
		# 小米手机的厂家在淘宝开店
		class XiaoMI function extends Taobao{
			
			public static function shop(){
				return new XiaoMI_Mobile();#卖的是自己的小米手机
			} 
		}
		 
		$one = Iphone::shop();#去苹果手机店里面
		$one->mobile();//手机
		$one->charger();//充电器
		
		$two = XiaoMI::shop();#去小米手机店里面
		$two->mobile();//手机
		$two->charger();//充电器
		

3.抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口。

例子:去淘宝买电子产品 只有两个电脑和手机两个种类的产品。 而且电脑产品只有:电脑和鼠标卖,手机产品只有:手机和充电器买。

#抽象工厂
 	#定义一个手机类电子产品的接口
	interface Mobile
	{
		#手机
	    public function mobile();
	 	#充电器
	    public function charger();
	}
 	# 苹果厂商
	class IPhone implements Mobile
	{
	    public function mobile()
	    {
	        echo "购买苹果手机";
	    }
	 
	    public function charger()
	    {
	        echo "购买苹果充电器";
	    }
	}
 	#定义一个电脑类电子产品的接口
	interface Computer
	{
		#电脑
	    public function computer();
	 	#鼠标
	    public function mouse();
	}
 	#小米厂商
	class XiaomiComputer implements Computer
	{
	    public function computer()
	    {
	        echo "购买小米电脑";
	    }
	 
	    public function mouse()
	    {
	        echo "购买小米鼠标";
	    }
	}
 	#定义一个抽象类的 店铺 里面提供手机产品和电脑产品
	abstract class Shop
	{
		#手机产品
	    abstract public static function createMobile();
	 	#电脑产品
	    abstract public static function createComputer();
	}
 	#淘宝
	class Taobao extends Shop{
		#手机产品
	    public static function createMobile()
	    {
	        return new IPhone();#只有苹果的手机产品买
	    }
	 	#电脑产品
	    public static function createComputer()
	    {
	        return new XiaomiComputer();#只有小米的电脑产品买
	    }
	}
 	#用户去淘宝选手机
	$one = Taobao::createMobile();#发现只有苹果的手机买
	$one->mobile();#买了一个苹果手机
	$one->charger();#买了一个苹果充电器
	
	#用户去淘宝选电脑
	$two = Taobao::createComputer();#发现只小米的电脑买
	$two->computer();#购买小米电脑
	$two->mouse()#购买小米鼠标
	

3.策略模式

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

代码示例:

#通过需要不同的日期信息来调用不同的类实现功能。
 #策略模式:
        #定义一个接口  日期转换
        interface Time
        {
            public function timeString();
        }

        # 当前的年份
        class Year implements Time{
            public function timeString(){
                   echo date('Y',time()).'年';
            }
        }
        # 当前的月份
        class Month implements Time{
            public function timeString(){
                echo date('m',time()).'月';
            }
        }
        # 当前的日期
        class Day implements Time{
            public function timeString(){
                echo date('Y-m-d',time());
            }
        }

        class Times {
            private $class;
            #根据所需的日期 来选择调用哪个类的方法
            public function timess(Time $class){
                 $this->class = $class;
                 return $this->class->timeString();
            }
        }

        $Year = new Times();
        #查看当前的年份
        $Year->timess(new Year());#2022年
        #查看当前的月份
        $Year->timess(new Month());#07月
        #查看当前的日期
        $Year->timess(new Day());#2022-07-20
        

4.适配器模式

将一个类的接口转成我们希望的另外一个接口,使得原本接口不兼容不能在一起工作的类可以在一起工作。

优点:灵活性和扩展性都非常好,符合开闭原则。
缺点:过多地使用适配器,会让系统非常零乱,不易整体进行把握。

代码示例:

#例如:封装一个缓存类,它支持  redis 和 memcache,只需切换使用时只需修改相关配置就能实现切换了,而不需要修改大量的代码。
#减少代码间的耦合,可以方便增减需要实现的类。
# 适配器模式
        #定义一个缓存类
        interface Cache
        {
            public function connect();
            public function set($key,$value,$time=0);
            public function get($key);
            public function del($key);
            public function close();
        }
		# 使用 redis 做为缓存
        class Rediss implements Cache
        {
            private $redis;

            public function __construct()
            {
                $this->connect();
            }
            public function connect()
            {
                $this->redis = new Redis();
                return $this->redis->connect('127.0.0.1','6379');
            }

            public function set($key,$value,$time=0)
            {
                if($time==0){
                    return $this->redis->set($key,$value);
                }else{
                    return $this->redis->setex($key,$time,$value);
                }
            }

            public function get($key)
            {
                return $this->redis->get($key);
            }

            public function del($key)
            {
                return $this->redis->delete($key);
            }
            public function close()
            {
                return $this->redis->close();
            }
        }
        
		#使用 memcache 做为缓存
	    class Memcaches implements Cache
	    {
	        private $memcache;
	
	        public function __construct()
	        {
	            $this->connect();
	        }
	        public function connect()
	        {
	            $this->memcache = new Memcache();
	            return $this->memcache->connect('127.0.0.1','11211');
	        }
	
	        public function set($key,$value,$time=0)
	        {
	            return $this->memcache->set($key,$value,false,$time);
	        }
	
	        public function get($key)
	        {
	            return $this->memcache->get($key);
	        }
	
	        public function del($key)
	        {
	            return $this->memcache->delete($key);
	        }
	        public function close()
	        {
	            return $this->memcache->close();
	        }
	    }
	    
    	#调用
		if($cache_config == 'redis'){
			# 使用 redis 
			$cache = new Rediss();  
		}else{
			# 使用 memcache
		    $cache = new Memcaches();
		}
		
		$cache->set('key','value');
        $cache->get('key'));
        $cache->del('key');
        $cache->close();	
    
		


5.注册模式

注册树模式通过将对象示例注册到一颗全局的对象树上, 需要的时候从对象树上采摘的模式设计方法。

代码示例:

 #注册模式
    class Register
    {
        #定义一个私有的变量
        private static $objects;
        # 注册类
        public static function set($key,$class)
        {
           if(!isset(self::$objects[$key])){
               self::$objects[$key] = $class;
           }
           return true;
        }
        #获取类的对象
        public static function get($key){
            if(!isset(self::$objects[$key])){
                return false;
            }
            return self::$objects[$key];
        }
        #取消注册类
        public static function unset_class($key){
            if(!isset(self::$objects[$key])){
                return false;
            }
            unset(self::$objects[$key]);
            return true;
        }
        #查看所有的类
        public static function all(){
            return self::$objects;
        }
    }
    # 定义一个类
    
	    #苹果手机类
	    class Apple{
	            public function __construct(){
	                echo '苹果手机:';
	            }
	            public function open(){
	                echo '开机';
	            }
	            public function close(){
	                echo '关机';
	            }
	    }
	    
	    #华为手机类
	    class HuaWei{
	        public function __construct(){
	            echo '华为手机:';
	        }
	        public function open(){
	            echo '开机';
	        }
	        public function close(){
	            echo '关机';
	        }
	    }
	    
	    #注册类
        Register::set('apple',new Apple());
        Register::set('huawei',new HuaWei());
		#获取类
       echo Register::get('apple')->close();#苹果手机:关机
       echo Register::get('huawei')->close();#华为手机:关机
       #查看所有注册类
        var_dump(Register::all());
        

6.观察者模式

观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是一个在项目中经常使用的模式定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

优点:降低了类对象之间的耦合度。
缺点:观察者较多时,可能会花费一定的开销来发消息,但这个消息可能仅一个观察者消费。

代码示例:

 #观察者模式 
	 #把购买商品这个接口 当做被观察的对象 
	 #把通知商户 , 通知用户,记录日志 当做观察者
        #例子 购买商品成功 需要通知商户 通知用户 记录日志等操作

            #定义一个通知的接口
            interface Send{
                public function sendMsg();
            }

            #给商户发消息 观察者
            class Shop implements Send{
                public function sendMsg(){
                   echo '<pre> 用户下单成功 </pre>';
                }
            }
            #给用户发消息 观察者
            class User implements Send{
                public function sendMsg(){
                    echo '<pre> 购买商品成功 </pre>';
                }
            }
            #给日志发消息 观察者
            class Loggs implements Send{
                public function sendMsg(){
                    echo '<pre> xx用户在xx商户购买xx商品成功 </pre>';
                }
            }

            #定义一个接口
            interface obeject{
                public function addObeject($key);
            }

            # 被观察的对象
            class Order implements obeject{
                private $obeject;
                #绑定通知
                public function addObeject($key){
                        $this->obeject[]=$key;
                }
                #购买逻辑
                public function addOrder(){
                    #写下单逻辑
                    #下单成功通知
                    foreach ($this->obeject as $value){
                        $value->sendMsg();
                    }
                }
            }
            $order = new Order();
            $order->addObeject(new Loggs());#<pre> xx用户在xx商户购买xx商品成功 </pre>
            $order->addObeject(new Shop());#<pre> 购买商品成功 </pre>
            $order->addOrder();
            
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 设计模式之最全面,最简单的讲解 的相关文章

  • 图像创建从jpeg() PHP

    我正在使用 imagecreatefromjpeg 函数合并两张图片 现在我面临的问题是 当我使用服务器中的图片时 它工作正常 而当我使用其他网站的图片时 它不起作用 例如 当我使用这个 PHP 文件时http coolfbapps in
  • 如何使用 PHP 获取列中的所有值?

    我一直在到处寻找这个问题 但仍然找不到解决方案 如何从 mySQL 列中获取所有值并将它们存储在数组中 例如 表名称 客户 列名称 ID 名称 行数 5 我想获取此表中所有 5 个名称的数组 我该如何去做呢 我正在使用 PHP 我试图 SE
  • 如何获取 URL 中未知的 $_GET 值的数组?

    我正在使用一个在线购物车 它接受订购的商品并通过 URL 将其唯一 ID 传递到 process php 页面 所以 URL 看起来像这样 process php code 1 231 code 2 532 code 3 342 Anoth
  • 如何将对象(模型类型对象)插入到 Laravel 中 Collection 对象的特定索引号处?

    我读过戴尔 里斯的代码明亮 https daylerees com codebright 了解更多关于雄辩的信息Collection在 Laravel 中使用 还做了一些其他研究 但找不到我正在寻找的答案 我想插入一个对象 Model输入对
  • 从 Symfony2 中的 http_basic auth 注销

    每当我去 admin logout 我已正确重定向到项目的根目录 但在访问时仍处于登录状态 admin 因为没有提示我输入凭据 这是我的配置 安全 yml security firewalls admin area pattern admi
  • 我们可以在 Bash 脚本中使用 PHP 吗?

    我有一个 bash 脚本abcd sh bin sh for i in seq 8 do ssh w i uptime ps elf grep httpd wc l free m mpstat done pid sleep 1 kill 9
  • Zend 框架会话丢失

    我有一个注册表单 当用户注册时 它会将他重定向到他的页面 在 Firefox 和 Chrome 中一切正常 但在 Internet Explorer 中则正常 看起来保存用户信息后 会话就关闭了 并且不会将用户重定向到他的页面 我该如何解决
  • 与 PHP 相比,Python 与 HTML 的“流畅”程度如何?

    我正在考虑从使用 PHP 切换到使用 Python 来开发 Web 应用程序 但我想知道 Python 是否像 PHP 一样擅长在 HTML 中穿插 本质上 我发现它使用起来非常简单 直观将 PHP 放在我想要的位置 然后可以随意安排 组织
  • 如何在PHP中完成http响应并进行进一步处理?

    就我而言 我需要向客户端回显一个标志并发送一封电子邮件 现在客户端需要等待电子邮件发送 但我想把这两个步骤分开 该怎么做呢 你可以看一下异步运行 PHP 任务 https stackoverflow com questions 858883
  • phpenmod 显示其他 php 版本的路径

    我的 Ubuntu 机器上安装了 php 7 0 和 7 2 当我执行时php v 它告诉我我正在使用 php 7 2 在 Apache 上我还启用了 php 7 2 当我跑步时phpenmode zip 我明白了 WARNING Modu
  • zend框架验证模型中的数据而不是表单中的数据

    使用 Zend Framework 2 在我的应用程序中 要编辑数据库中的数据 可以编译 html 表单或发送 http post 请求 我的服务器作为 Web 服务实现 在第二种情况下 不会呈现表单 问题 如果当服务器收到不是从表单发送而
  • 如何将路径添加到 Apache PATH 变量?

    我在 apache2 的 custom conf 文件中设置了以下内容 SetEnv PATH PATH opt local lib mysql5 bin this is a test 但是它不起作用 当我打电话时 hey shell ex
  • php - 重定向ajax请求[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何在 php wordpress 中重定向 ajax 请求 I tried header Location http redirect
  • Google Drive V3、Google API 客户端 2.0 - 批量上传失败

    使用 Google Drive V3 和 API v2 0 主分支进行批量上传失败 我已经修改了https github com google google api php client blob master examples batch
  • MVC 框架中的缓存策略?

    我编写了自己的小型 PHP MVC 框架 现在正在探索 PHP MVC 框架中的缓存策略 我正在考虑可以缓存什么 在哪里以及如何缓存 我的框架是简单的MVC框架 我有前端控制器 它启动应用程序 注册类自动加载 设置 php 运行时指令 最后
  • Laravel 5 Eloquent 在多个级别上将关系附加到 JSON

    因此 在模型中包含关系非常容易 例如 class User extends Model protected with roles class Role extends Model protected with permissions 当有对
  • 使用 yaml 路由描述时如何在运行时获取 Symfony2 中的路由名称?

    在这里你可以找到我的n关于 Symfony2 的第一个问题 我正在与一个分页捆绑 https github com makerlabs PagerBundle wiki使用中提供的路由名称routing yml文件 从我的角度来看 这种方法
  • 将 docker-compose.yml 中的包安装到 docker 容器中

    我是 docker 和 docker compose 的初学者 我需要你的帮助 我正在使用 docker compose 制作 PHP NGINX PostgresQL symfony 开发环境 这里是 web image nginx 1
  • 单元测试和静态方法

    阅读并学习单元测试 试图理解以下帖子 http misko hevery com 2008 12 15 static methods are death to testability 这解释了静态函数调用的困难 我不太清楚这个问题 我一直认
  • SimpleXML 返回空数组

    我正在尝试使用 Google Maps API 和 PHP SimpleXML 获取城市的纬度和经度 我尝试这样做 xml simplexml load file http maps googleapis com maps api geoc

随机推荐

  • 学习STM32(3)-电源、时钟、复位电路

    Stm32 时钟分析 该分析材料大部分来自opendev 论坛 xff0c 我所做的只不过是加上一些自己的分析和整理 xff0c 由于个人能力有限 xff0c 纰漏之处在所难免 xff0c 欢迎指正 一 硬件上的连接问题 如果使用内部RC振
  • 只是运行roslauch来发布一次TF

    如果只是希望运行roslaunch来发布一次TF xff0c 可以使用launch文件中的node标签来实现 下面是一个发布一次TF的launch文件例子 xff1a lt launch gt lt node pkg 61 34 tf2 r
  • 2019年年终总结(流水账)

    2019年年终总结 流水账 前言 马上就要是2020年了 xff0c 我此时敲下我的第一篇年终总结 马上就要过去的2019年对于我来说是平凡但却不平淡的一年 xff0c 这一年里我经历了很多 xff0c 虽然这些在别人眼中可能是微不足道的
  • 融资租赁与经营租赁的区别

    我现在手上项目的客户是一家销售公司 xff0c 他们有把自己的商品租赁给别的公司经营的业务 于是就有了上面的融资租赁与经营租赁 xff0c 这两种方式在财务上对资产的处理是不一样的 下面我们来看看这个场景 xff1a A公司把资产租给B公司
  • 【Linux网络编程(五)】TCP编程流程

    文章目录 TCP编程1 TCP介绍 编程流程2 TCP C S架构3 TCP客户端编程流程1 创建TCP套接字2 connect连接服务器3 send发送请求4 recv接收应答 xff08 默认带阻塞 xff09 5 close6 客户端
  • ESP32-Drone四旋翼无人机代码编译发现的二个问题及解决方法

    摘要 ESP32 Drone四旋翼无人机是乐鑫的一个开源项目 xff0c 我根据官方的硬件参考设计 xff0c 重新使用KiCAD绘制了原理图和PCB板 xff0c 并制作了控制板样板 xff0c 在配置了ESP idf 4 4编程环境编译
  • 小觅相机运行vins-mono

    小觅相机运行vins mono span class token function mkdir span p mynt eye vins catkin ws src span class token function cd span myn
  • 程序员改变世界,从未如此直观

    万万没想到 xff0c 包博士的代码让一个六岁的小学生哇哇大哭 这个让小学生流眼泪的 科学家代表 有非常漂亮的履历 xff1a 清华大学毕业 博士曾在斯坦福就读 xff0c 他现在是VIPKID的首席AI科学家 xff0c 带领四十多人的产
  • 【Linux系统编程(十五)】信号量

    文章目录 信号量1 信号量1 1 信号量的概述1 2 信号量的API1 2 1 初始化信号量1 2 2 信号量减一 xff08 P操作 xff09 1 2 3 尝试对信号量减一1 2 4 信号量加一 xff08 V操作 xff09 1 2
  • 【ESP32_FreeRTOS篇】

    FreeRTOS 是一款 开源免费 的实时操作系统 xff0c 遵循的是 GPLv2 43 的许可协议 这里说 到的开源 xff0c 指的是你可以免费得获取到 FreeRTOS 的源代码 xff0c 且当你的产品使用了 FreeRTOS 且
  • 【FreeRTOS(十四)】StreamBuffer

    文章目录 数据流创建 xStreamBufferCreate发送 xStreamBufferSend接受 xStreamBufferReceive查询流缓冲区 xStreamBufferSpacesAvailable代码示例 数据流 创建
  • 【FreeRTOS(十五)】MessageBuffer

    文章目录 MessageBuffer创建 xMessageBufferCreate发送 xMessageBufferSend接收 xMessageBufferReceive代码示例 MessageBuffer 创建 xMessageBuff
  • 【Git】Git修改 commit 的信息

    Git 修改 commit 的信息 xff1a git log 查看提交日志 xff0c 找到要修改的commit xff1a git rebase i HEAD n 1 切换到需要修改的 commit 中 xff0c n为commit的序
  • PX4飞控之PWM输出控制

    PX4飞控之PWM输出控制 多旋翼电调如好盈XRotor xff0c DJI通用电调等都支持PWM信号来传输控制信号 常用的400Hz电调信号对应周期2500us xff0c 一般使用高电平时间1000us 2000us为有效信号区间 xf
  • 记录docker+github的学习历程

    最早从github上拉代码 xff0c 拉一些纯python的代码 xff0c 然后第二天就发现如果只是为了学习代码 xff0c 直接下载压缩包完事 为什么需要docker 43 github呢 xff1f github上的代码是不同的运行
  • 为什么同样的方法,你做的品牌火不起来?别人却能脱颖而出?

    要想让品牌快速走红 xff0c 必须做好品牌运营 同样进入红海市场 xff0c 江小白 喜茶 丧茶靠品牌运营 xff0c 快速占据一席之地 同样是知名品牌 xff0c 杜蕾斯靠品牌运营 xff0c 牢牢占据用户心智第一位 xff0c 同类目
  • 开发自己的DJI四旋翼无人机(A3飞控Onboard SDK和Mobile SDK介绍)

    大疆作为无人机行业的佼佼者 xff0c 其应用范围从户外旅行 拍照到影视拍摄 xff0c 以及工业运用都有着极高的地位 那么 xff0c 我们如何仅仅使用大疆的飞控来开发出我们自己的无人机呢 xff1f 首先 xff0c 你需要如下的东西
  • PID的曲线

  • ESP-Drone四旋翼无人机控制板上的MPU6050陀螺仪芯片I2C总线测试

    1 摘要 一款新的控制板卡在第一次使用时 xff0c 都需要进行硬件功能的测试 xff0c 以确保所有的硬件都能够正常工作后 xff0c 才可以进入后续的软件编程阶段 xff0c ESP Drone四旋翼无人机的控制板使用了mpu6050陀
  • PHP 设计模式之最全面,最简单的讲解

    1 单例模式 单例模式是指只创建一个资源 对象 数据库链接等 xff0c 防止外部实例 43 判断是否有返回或创建后返回对象 三个要点 xff1a 1 需要一个保存类的唯一实例的静态成员变量 2 构造函数和克隆函数必须声明为私有的 xff0